Merge branch 'master' into mail

This commit is contained in:
PikalaxALT 2017-10-13 11:16:34 -04:00
commit e24f3808f4
94 changed files with 13841 additions and 20563 deletions

1
.gitignore vendored
View File

@ -23,5 +23,6 @@ tools/*
*.dump
*.sa*
Thumbs.db
build/
.DS_Store
*.ddump

104
Makefile
View File

@ -1,5 +1,19 @@
SHELL := /bin/bash -o pipefail
ROM := pokeemerald.gba
OBJ_DIR := build/emerald
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)
AS := $(DEVKITARM)/bin/arm-none-eabi-as
ASFLAGS := -mcpu=arm7tdmi
@ -10,7 +24,7 @@ CPP := $(DEVKITARM)/bin/arm-none-eabi-cpp
CPPFLAGS := -I tools/agbcc/include -iquote include -nostdinc -undef
LD := $(DEVKITARM)/bin/arm-none-eabi-ld
LDFLAGS := -T ld_script.ld -Map pokeemerald.map
LDFLAGS = -Map $(MAP)
OBJCOPY := $(DEVKITARM)/bin/arm-none-eabi-objcopy
@ -20,7 +34,7 @@ SHA1 := sha1sum -c
GFX := tools/gbagfx/gbagfx
AIF := tools/aif2pcm/aif2pcm
MID := tools/mid2agb/mid2agb
MID := $(abspath tools/mid2agb/mid2agb)
SCANINC := tools/scaninc/scaninc
PREPROC := tools/preproc/preproc
RAMSCRGEN := tools/ramscrgen/ramscrgen
@ -35,19 +49,19 @@ RAMSCRGEN := tools/ramscrgen/ramscrgen
.PHONY: rom clean compare tidy
C_SRCS := $(wildcard src/*.c)
C_OBJS := $(C_SRCS:%.c=%.o)
$(shell mkdir -p $(C_BUILDDIR) $(ASM_BUILDDIR) $(DATA_ASM_BUILDDIR))
ASM_SRCS := $(wildcard asm/*.s)
ASM_OBJS := $(ASM_SRCS:%.s=%.o)
C_SRCS := $(wildcard $(C_SUBDIR)/*.c)
C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS))
DATA_ASM_SRCS := $(wildcard data/*.s)
DATA_ASM_OBJS := $(DATA_ASM_SRCS:%.s=%.o)
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))
OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS)
ROM := pokeemerald.gba
ELF := $(ROM:.gba=.elf)
OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS))
rom: $(ROM)
@ -59,8 +73,8 @@ clean: tidy
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 ld_script.ld sym_bss.ld sym_common.ld sym_ewram.ld
rm -f $(ROM) $(ELF) $(OBJS) $(C_SRCS:%.c=%.i) pokeemerald.map
rm -f $(ROM) $(ELF) $(MAP)
rm -r build/*
include graphics_file_rules.mk
@ -75,56 +89,62 @@ include graphics_file_rules.mk
%.lz: % ; $(GFX) $< $@
%.rl: % ; $(GFX) $< $@
src/libc.o: CC1 := tools/agbcc/bin/old_agbcc
src/libc.o: CFLAGS := -O2
$(C_BUILDDIR)/libc.o: CC1 := tools/agbcc/bin/old_agbcc
$(C_BUILDDIR)/libc.o: CFLAGS := -O2
src/siirtc.o: CFLAGS := -mthumb-interwork
$(C_BUILDDIR)/siirtc.o: CFLAGS := -mthumb-interwork
src/agb_flash.o: CFLAGS := -O -mthumb-interwork
src/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork
src/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/agb_flash.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/agb_flash_1m.o: CFLAGS := -O -mthumb-interwork
$(C_BUILDDIR)/agb_flash_mx.o: CFLAGS := -O -mthumb-interwork
src/m4a_2.o: CC1 := tools/agbcc/bin/old_agbcc
src/m4a_4.o: CC1 := tools/agbcc/bin/old_agbcc
$(C_BUILDDIR)/m4a_2.o: CC1 := tools/agbcc/bin/old_agbcc
$(C_BUILDDIR)/m4a_4.o: CC1 := tools/agbcc/bin/old_agbcc
ifeq ($(NODEP),)
%.o: c_dep = $(shell $(SCANINC) $*.c)
$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) $(C_SUBDIR)/$*.c)
else
%.o: c_dep :=
$(C_BUILDDIR)/%.o: c_dep :=
endif
$(C_OBJS): %.o : %.c $$(c_dep)
@$(CPP) $(CPPFLAGS) $< -o $*.i
@$(PREPROC) $*.i charmap.txt | $(CC1) $(CFLAGS) -o $*.s
@echo -e ".text\n\t.align\t2, 0\n" >> $*.s
$(AS) $(ASFLAGS) -o $@ $*.s
$(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
@echo -e ".text\n\t.align\t2, 0\n" >> $(C_BUILDDIR)/$*.s
$(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s
ifeq ($(NODEP),)
%.o: asm_dep = $(shell $(SCANINC) $*.s)
$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) $(ASM_SUBDIR)/$*.s)
else
%.o: asm_dep :=
$(ASM_BUILDDIR)/%.o: asm_dep :=
endif
$(ASM_OBJS): %.o: %.s $$(asm_dep)
$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep)
$(AS) $(ASFLAGS) -o $@ $<
$(DATA_ASM_OBJS): %.o: %.s $$(asm_dep)
ifeq ($(NODEP),)
$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s)
else
$(DATA_ASM_BUILDDIR)/%.o: data_dep :=
endif
$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep)
$(PREPROC) $< charmap.txt | $(AS) $(ASFLAGS) -o $@
sym_bss.ld: sym_bss.txt
$(RAMSCRGEN) .bss sym_bss.txt ENGLISH >$@
$(OBJ_DIR)/sym_bss.ld: sym_bss.txt
$(RAMSCRGEN) .bss $< ENGLISH > $@
sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt)
$(RAMSCRGEN) COMMON sym_common.txt ENGLISH -c src,common_syms >$@
$(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt)
$(RAMSCRGEN) COMMON $< ENGLISH -c $(C_BUILDDIR),common_syms > $@
sym_ewram.ld: sym_ewram.txt
$(RAMSCRGEN) ewram_data sym_ewram.txt ENGLISH >$@
$(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt
$(RAMSCRGEN) ewram_data $< ENGLISH > $@
ld_script.ld: ld_script.txt sym_bss.ld sym_common.ld sym_ewram.ld
sed -f ld_script.sed ld_script.txt >ld_script.ld
$(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" | sed "s#sound/#../../sound/#g" > ld_script.ld
$(ELF): ld_script.ld $(OBJS)
$(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBGCC)
$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS)
cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../../$@ $(OBJS_REL) ../../$(LIBGCC)
$(ROM): $(ELF)
$(OBJCOPY) -O binary --gap-fill 0xFF --pad-to 0x9000000 $< $@

File diff suppressed because it is too large Load Diff

View File

@ -5212,7 +5212,7 @@ sub_8061F90: @ 8061F90
thumb_func_start sub_8061F9C
sub_8061F9C: @ 8061F9C
push {lr}
bl sub_8063880
bl AI_TrySwitchOrUseItem
bl OpponentBufferExecCompleted
pop {r0}
bx r0
@ -5243,7 +5243,7 @@ sub_8061FB8: @ 8061FB8
movs r0, 0x1
movs r1, 0xA
_08061FD6:
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
_08061FDA:
bl OpponentBufferExecCompleted
b _08062156
@ -5347,7 +5347,7 @@ _0806209C:
movs r0, 0x1
movs r1, 0xA
adds r2, r4, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
b _08061FDA
.pool
_080620C4:
@ -5378,7 +5378,7 @@ _080620C6:
movs r0, 0x1
movs r1, 0xA
adds r2, r4, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
b _08062152
.pool
_08062108:
@ -5401,7 +5401,7 @@ _08062108:
orrs r2, r4
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
b _08062152
.pool
_0806213C:
@ -5413,7 +5413,7 @@ _0806213C:
orrs r2, r4
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
_08062152:
bl OpponentBufferExecCompleted
_08062156:
@ -5456,7 +5456,7 @@ sub_8062188: @ 8062188
ldrb r0, [r1]
cmp r0, 0x6
bne _08062254
bl sub_8063A90
bl GetMostSuitableMonToSwitchInto
lsls r0, 24
lsrs r4, r0, 24
cmp r4, 0x6

View File

@ -226,7 +226,7 @@ _0805764C:
movs r0, 0x1
movs r1, 0x3
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
b _080577C2
_08057658:
movs r0, 0x20
@ -393,7 +393,7 @@ _080577B2:
movs r1, 0xC
_080577BC:
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
_080577C2:
bl PlayerBufferExecCompleted
b _080577E8
@ -518,7 +518,7 @@ _080578A0:
orrs r2, r0
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
ldrb r0, [r4]
movs r1, 0x1
bl dp11b_obj_free
@ -1086,7 +1086,7 @@ _08057E14:
_08057E1C:
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl PlayerBufferExecCompleted
b _08057F9E
.pool
@ -3413,7 +3413,7 @@ _080591FE:
lsrs r2, 16
movs r0, 0x1
movs r1, 0xB
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
strb r5, [r4]
bl battle_type_is_double
lsls r0, 24
@ -3686,7 +3686,7 @@ _08059430:
lsrs r2, 16
movs r0, 0x1
movs r1, 0xB
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
strb r5, [r4]
ldr r0, =sub_8059544
str r0, [r6]
@ -4291,14 +4291,14 @@ _08059A2C:
movs r0, 0x1
movs r1, 0xE
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
b _08059A76
.pool
_08059A6C:
movs r0, 0x1
movs r1, 0xD
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
_08059A76:
bl PlayerBufferExecCompleted
_08059A7A:
@ -8658,7 +8658,7 @@ sub_805C158: @ 805C158
lsrs r2, 16
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl PlayerBufferExecCompleted
_0805C194:
pop {r0}
@ -9378,7 +9378,7 @@ sub_805C80C: @ 805C80C
movs r0, 0x1
movs r1, 0
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl PlayerBufferExecCompleted
pop {r0}
bx r0

View File

@ -645,7 +645,7 @@ _081BB2E2:
lsrs r2, 16
movs r0, 0x1
movs r1, 0xB
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
strb r5, [r4]
bl battle_type_is_double
lsls r0, 24
@ -918,7 +918,7 @@ _081BB514:
lsrs r2, 16
movs r0, 0x1
movs r1, 0xB
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
strb r5, [r4]
ldr r0, =sub_81BB628
str r0, [r6]
@ -4990,7 +4990,7 @@ sub_81BDAA0: @ 81BDAA0
thumb_func_start sub_81BDAAC
sub_81BDAAC: @ 81BDAAC
push {lr}
bl sub_8063880
bl AI_TrySwitchOrUseItem
bl PlayerPartnerBufferExecCompleted
pop {r0}
bx r0
@ -5068,7 +5068,7 @@ _081BDB3C:
orrs r2, r5
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl PlayerPartnerBufferExecCompleted
pop {r4-r6}
pop {r0}
@ -5087,7 +5087,7 @@ sub_81BDB70: @ 81BDB70
thumb_func_start sub_81BDB7C
sub_81BDB7C: @ 81BDB7C
push {r4-r6,lr}
bl sub_8063A90
bl GetMostSuitableMonToSwitchInto
lsls r0, 24
lsrs r4, r0, 24
cmp r4, 0x6

View File

@ -4754,7 +4754,7 @@ sub_8188EF0: @ 8188EF0
lsrs r1, 24
movs r0, 0x1
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl RecordedOpponentBufferExecCompleted
pop {r0}
bx r0
@ -4785,7 +4785,7 @@ sub_8188F20: @ 8188F20
lsrs r2, 16
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
b _08188F6C
.pool
_08188F48:
@ -4803,7 +4803,7 @@ _08188F48:
orrs r2, r4
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
_08188F6C:
bl RecordedOpponentBufferExecCompleted
pop {r4,r5}

View File

@ -4861,7 +4861,7 @@ sub_818C49C: @ 818C49C
lsrs r1, 24
movs r0, 0x1
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl RecordedPlayerBufferExecCompleted
_0818C4C6:
pop {r0}
@ -4897,7 +4897,7 @@ _0818C508:
lsrs r1, 24
movs r0, 0x1
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl RecordedPlayerBufferExecCompleted
_0818C522:
pop {r0}
@ -4929,7 +4929,7 @@ sub_818C538: @ 818C538
lsrs r2, 16
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
b _0818C584
.pool
_0818C560:
@ -4947,7 +4947,7 @@ _0818C560:
orrs r2, r4
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
_0818C584:
bl RecordedPlayerBufferExecCompleted
pop {r4,r5}

View File

@ -103,13 +103,13 @@ _0815942A:
movs r1, 0x7
_0815942E:
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
b _08159440
_08159436:
movs r0, 0x1
movs r1, 0x8
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
_08159440:
bl SafariBufferExecCompleted
b _0815954E

View File

@ -153,7 +153,7 @@ _081684CE:
movs r1, 0x9
_081684E4:
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl WallyBufferExecCompleted
ldr r1, [r4]
adds r1, 0x94
@ -208,7 +208,7 @@ _08168540:
movs r0, 0x1
movs r1, 0x1
movs r2, 0
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl WallyBufferExecCompleted
_08168564:
pop {r4,r5}
@ -3777,7 +3777,7 @@ _0816A550:
lsls r2, 1
movs r0, 0x1
movs r1, 0xA
bl dp01_build_cmdbuf_x21_a_bb
bl EmitCmd_x21
bl WallyBufferExecCompleted
_0816A574:
pop {r4}

View File

@ -12935,7 +12935,7 @@ _081A1118:
adds r1, r0, 0
mov r0, sp
movs r2, 0x2
bl sub_81DB5E8
bl TVShowConvertInternationalString
adds r0, r5, 0
mov r1, sp
bl StringCopy
@ -18997,7 +18997,7 @@ sub_81A4594: @ 81A4594
adds r1, r6, 0x6
ldrb r2, [r6, 0xE]
add r0, sp, 0xC
bl sub_81DB5E8
bl TVShowConvertInternationalString
ldr r1, =gUnknown_0203AB74
ldrb r0, [r1]
mov r3, r8
@ -19111,7 +19111,7 @@ sub_81A4684: @ 81A4684
adds r1, 0xA
ldrb r2, [r5, 0x1A]
add r0, sp, 0xC
bl sub_81DB5E8
bl TVShowConvertInternationalString
ldr r1, =gUnknown_0203AB74
ldrb r0, [r1]
adds r3, r7, 0x2
@ -19133,13 +19133,13 @@ sub_81A4684: @ 81A4684
adds r4, r5, 0
adds r4, 0x12
adds r0, r4, 0
bl sub_8009228
bl IsStringJapanese
cmp r0, 0
beq _081A4734
add r0, sp, 0xC
adds r1, r4, 0
movs r2, 0x1
bl sub_81DB5E8
bl TVShowConvertInternationalString
b _081A473C
.pool
_081A4734:
@ -28660,7 +28660,7 @@ _081A95EE:
lsls r0, r7, 2
adds r0, r1
ldr r0, [r0]
bl box_related_two__2
bl ShowFieldMessage
add sp, 0x8
pop {r3,r4}
mov r8, r3

View File

@ -3193,7 +3193,7 @@ _0817E63A:
adds r1, r4, 0
ldr r2, [sp]
ldr r3, [sp, 0x4]
bl sub_80ECB00
bl PutBattleUpdateOnTheAir
b _0817E670
.pool
_0817E65C:
@ -3205,7 +3205,7 @@ _0817E65C:
adds r1, r4, 0
ldr r2, [sp]
ldr r3, [sp, 0x4]
bl sub_80ECB00
bl PutBattleUpdateOnTheAir
_0817E670:
add sp, 0x20
pop {r3-r5}

View File

@ -2407,7 +2407,7 @@ _080B1AD8:
.pool
_080B1AEC:
bl sub_80B1C7C
bl box_related_two__2
bl ShowFieldMessage
_080B1AF4:
pop {r0}
bx r0
@ -2468,7 +2468,7 @@ _080B1B56:
special_trainer_unable_to_battle: @ 80B1B60
push {lr}
bl sub_80B1D18
bl box_related_two__2
bl ShowFieldMessage
pop {r0}
bx r0
thumb_func_end special_trainer_unable_to_battle

View File

@ -1795,7 +1795,7 @@ _08162ED8:
adds r0, 0xE4
ldrb r2, [r0]
adds r0, r6, 0
bl sub_81DB5E8
bl TVShowConvertInternationalString
b _08162F62
.pool
_08162F00:
@ -1835,7 +1835,7 @@ _08162F3E:
adds r1, r0, 0
adds r0, r6, 0
adds r2, r4, 0
bl sub_81DB5E8
bl TVShowConvertInternationalString
b _08162F62
.pool
_08162F5C:
@ -5016,7 +5016,7 @@ _08164B04:
lsls r0, 2
adds r0, r1
ldr r0, [r0]
bl box_related_two__2
bl ShowFieldMessage
b _08164B54
.pool
_08164B28:
@ -5040,7 +5040,7 @@ _08164B28:
lsls r1, 2
adds r1, r0
ldr r0, [r1]
bl box_related_two__2
bl ShowFieldMessage
_08164B54:
add sp, 0x8
pop {r3-r5}
@ -5673,7 +5673,7 @@ _0816508C:
bl SetMonData
ldr r0, [r7]
adds r0, r4
bl sub_80EE5A4
bl GetRibbonCount
strb r0, [r5, 0x1]
_081650D4:
adds r5, 0x4

View File

@ -1275,7 +1275,7 @@ _080802AC:
strh r0, [r1]
adds r5, 0x1
_080802D4:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
@ -1295,7 +1295,7 @@ _080802EC:
bl sub_807FD90
b _08080336
_08080302:
bl sub_8009FCC
bl GetLinkPlayerCount
ldr r2, =gUnknown_020322A4
ldr r1, [r2]
adds r1, 0x7C
@ -6091,7 +6091,7 @@ _08082BEE:
lsls r0, 24
lsrs r5, r0, 24
_08082BF4:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
@ -6104,7 +6104,7 @@ _08082C0C:
lsls r0, 24
lsrs r5, r0, 24
_08082C12:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
@ -6118,7 +6118,7 @@ _08082C12:
cmp r0, 0
bne _08082C0C
_08082C2E:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
@ -6132,7 +6132,7 @@ _08082C48:
lsls r0, 24
lsrs r5, r0, 24
_08082C4E:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
@ -6149,7 +6149,7 @@ _08082C6A:
ldr r4, =gUnknown_03003110
adds r0, r4, 0
bl sub_8081F94
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
@ -8568,7 +8568,7 @@ sub_8083F94: @ 8083F94
ldrb r0, [r5, 0x12]
str r0, [sp]
adds r0, r7, 0
bl sub_80ECC04
bl Put3CheersForPokeblocksOnTheAir
lsls r0, 24
cmp r0, 0
bne _080840BA
@ -8617,7 +8617,7 @@ _08084058:
ldrb r0, [r5, 0x12]
str r0, [sp]
adds r0, r7, 0
bl sub_80ECC04
bl Put3CheersForPokeblocksOnTheAir
lsls r0, 24
cmp r0, 0
beq _080840C4

View File

@ -1059,7 +1059,7 @@ _080B2C5C:
lsls r0, 24
lsrs r4, r0, 24
_080B2C7E:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@ -1361,7 +1361,7 @@ _080B2F0C:
movs r0, 0
mov r8, r0
mov r9, r0
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r5, r0, 24
movs r4, 0
@ -1984,7 +1984,7 @@ _080B3474:
adds r5, 0x1C
adds r4, 0x1
_080B349A:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@ -2080,7 +2080,7 @@ _080B3574:
beq _080B35F8
b _080B35FE
_080B357A:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r3, r0, 24
movs r4, 0
@ -2297,7 +2297,7 @@ _080B3750:
b _080B37CC
_080B375A:
ldr r0, =gUnknown_08278091
bl box_related_two__2
bl ShowFieldMessage
movs r0, 0x1
strh r0, [r5, 0x8]
b _080B37CC

View File

@ -1525,7 +1525,7 @@ sub_80D8490: @ 80D8490
movs r6, 0
ldr r0, =gUnknown_02039F25
mov r8, r0
ldr r2, =gUnknown_02039E1E
ldr r2, =gUnknown_02039E00 + 30
mov r10, r2
ldr r7, =gUnknown_02039F34
_080D84B8:
@ -2624,7 +2624,7 @@ _080D8EF2:
bl sub_80DB89C
ldr r0, =gStringVar1
lsls r1, r6, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
mov r2, r9
@ -3562,7 +3562,7 @@ _080D96D4:
bl sub_80DB89C
ldr r0, =gStringVar1
lsls r1, r6, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
ldr r4, =gStringVar4
@ -3671,7 +3671,7 @@ _080D97DC:
bl sub_80DB89C
ldr r0, =gStringVar1
lsls r1, r6, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
ldr r4, =gStringVar4
@ -3809,7 +3809,7 @@ _080D9904:
bl sub_80DB89C
ldr r0, =gStringVar1
lsls r1, r6, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
ldr r4, =gStringVar4
@ -4010,7 +4010,7 @@ _080D9AD2:
bl sub_80DB89C
ldr r0, =gStringVar1
lsls r1, r6, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
ldr r4, =gUnknown_02039F34
@ -4381,7 +4381,7 @@ _080D9DD4:
lsls r1, 20
lsrs r1, 29
lsls r1, 6
ldr r4, =gUnknown_02039E02
ldr r4, =gUnknown_02039E00 + 2
adds r1, r4
bl StringCopy
ldr r0, =gStringVar1
@ -4476,7 +4476,7 @@ _080D9EDC:
bl sub_80DC9B4
ldr r0, =gStringVar1
lsls r1, r6, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
ldr r0, =gStringVar2
@ -4626,7 +4626,7 @@ _080DA038:
bl sub_80DB89C
ldr r0, =gStringVar1
lsls r1, r6, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
ldr r4, =gStringVar4
@ -5096,7 +5096,7 @@ sub_80DA3CC: @ 80DA3CC
ldr r0, =gStringVar1
ldrb r1, [r5]
lsls r1, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
ldr r5, =gStringVar4
@ -5360,7 +5360,7 @@ _080DA600:
lsls r0, 2
adds r0, r2
ldrh r0, [r0, 0x8]
bl sub_80ED03C
bl BravoTrainerPokemonProfile_BeforeInterview1
b _080DA668
.pool
_080DA65C:
@ -5667,7 +5667,7 @@ _080DA8F2:
ldr r5, =gUnknown_02039F25
ldrb r0, [r5]
lsls r0, 6
ldr r4, =gUnknown_02039E0D
ldr r4, =gUnknown_02039E00 + 13
adds r0, r4
mov r1, sp
movs r2, 0x8
@ -6451,7 +6451,7 @@ sub_80DAF1C: @ 80DAF1C
add r0, sp, 0x4
bl StringCopy
lsls r1, r5, 6
ldr r0, =gUnknown_02039E0D
ldr r0, =gUnknown_02039E00 + 13
adds r1, r0
add r0, sp, 0x4
bl StringAppend
@ -6508,7 +6508,7 @@ sub_80DAFA0: @ 80DAFA0
lsls r1, 24
lsrs r1, 24
lsls r0, r4, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r0, r2
bl sub_80DAED4
ldr r0, =gUnknown_02039F26
@ -11173,7 +11173,7 @@ sub_80DD45C: @ 80DD45C
lsrs r6, r1, 24
ldr r0, =gStringVar1
lsls r1, r4, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
ldr r0, =gStringVar2
@ -15385,21 +15385,21 @@ _080DF6AE:
beq _080DF6AE
_080DF6C4:
mov r0, r9
bl sub_80ECDA4
bl ContestLiveUpdates_BeforeInterview_1
mov r0, r10
bl sub_80ECDF4
bl ContestLiveUpdates_BeforeInterview_2
ldr r5, [sp, 0x4]
lsrs r0, r5, 24
bl sub_80ECE34
bl ContestLiveUpdates_BeforeInterview_3
ldr r0, =gUnknown_02039F34
ldr r0, [r0]
ldr r0, [r0, 0x1C]
add r0, r8
ldrh r0, [r0, 0xA]
bl sub_80ECE74
bl ContestLiveUpdates_BeforeInterview_4
adds r0, r4, 0
adds r1, r6, 0
bl sub_80ECEB4
bl ContestLiveUpdates_BeforeInterview_5
_080DF6EE:
add sp, 0xC
pop {r3-r5}

View File

@ -144,7 +144,7 @@ sub_81563B0: @ 81563B0
beq _081564A0
adds r7, r5, 0
ldr r6, =gAIScriptPtr
ldr r0, =gUnknown_02039E1E
ldr r0, =gUnknown_02039E00 + 30
mov r8, r0
_081563CC:
ldr r0, [r7]
@ -5030,7 +5030,7 @@ sub_8158948: @ 8158948
push {r4-r6,lr}
movs r5, 0
movs r4, 0
ldr r6, =gUnknown_02039E1E
ldr r6, =gUnknown_02039E00 + 30
_08158950:
lsls r1, r4, 1
ldr r0, =gUnknown_02039F34

View File

@ -1239,7 +1239,7 @@ _080F6334:
ldr r1, =gUnknown_02039F20
ldrb r0, [r1]
ldr r7, =gStringVar1
ldr r2, =gUnknown_02039E0D
ldr r2, =gUnknown_02039E00 + 13
mov r8, r2
cmp r0, 0
beq _080F636E
@ -1750,7 +1750,7 @@ task_repel: @ 80F67C4
ldrb r0, [r0]
adds r0, r1
ldrb r0, [r0]
bl sub_80ED090
bl BravoTrainerPokemonProfile_BeforeInterview2
_080F67E6:
movs r0, 0
str r0, [sp]
@ -4785,7 +4785,7 @@ _080F8074:
ldrb r0, [r6]
muls r0, r5
adds r0, r4
bl sub_80EE5A4
bl GetRibbonCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@ -4834,7 +4834,7 @@ _080F80E2:
ldrb r0, [r7]
muls r0, r6
adds r0, r5
bl sub_80EE5A4
bl GetRibbonCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@ -4883,7 +4883,7 @@ _080F814E:
ldrb r0, [r7]
muls r0, r6
adds r0, r5
bl sub_80EE5A4
bl GetRibbonCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@ -4926,7 +4926,7 @@ _080F8190:
ldrb r0, [r7]
muls r0, r6
adds r0, r5
bl sub_80EE5A4
bl GetRibbonCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@ -4969,7 +4969,7 @@ _080F81F8:
ldrb r0, [r7]
muls r0, r6
adds r0, r5
bl sub_80EE5A4
bl GetRibbonCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@ -4994,7 +4994,7 @@ sub_80F8264: @ 80F8264
ldr r0, =gSpecialVar_0x8006
ldrh r1, [r0]
lsls r1, 6
ldr r0, =gUnknown_02039E0D
ldr r0, =gUnknown_02039E00 + 13
adds r1, r0
adds r0, r4, 0
bl StringCopy
@ -5013,7 +5013,7 @@ sub_80F8290: @ 80F8290
ldr r1, =gSpecialVar_0x8006
ldrh r1, [r1]
lsls r1, 6
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
adds r1, r2
bl StringCopy
pop {r0}
@ -5104,7 +5104,7 @@ sub_80F834C: @ 80F834C
ldr r2, =gUnknown_02039F20
ldrb r0, [r2]
ldr r4, =gStringVar3
ldr r3, =gUnknown_02039E0D
ldr r3, =gUnknown_02039E00 + 13
cmp r0, 0
beq _080F836E
_080F835C:
@ -5137,7 +5137,7 @@ sub_80F8390: @ 80F8390
ldr r2, =gUnknown_02039F20
ldrb r0, [r2]
ldr r4, =gStringVar1
ldr r3, =gUnknown_02039E02
ldr r3, =gUnknown_02039E00 + 2
cmp r0, 0
beq _080F83B2
_080F83A0:
@ -5578,7 +5578,7 @@ sub_80F8714: @ 80F8714
b _080F877E
.pool
_080F8748:
ldr r5, =gUnknown_02039E02
ldr r5, =gUnknown_02039E00 + 2
movs r4, 0x3
_080F874C:
adds r0, r5, 0

View File

@ -141,7 +141,7 @@ sub_80FC5DC: @ 80FC5DC
bl GetMultiplayerId
ldr r1, =gUnknown_02039F25
strb r0, [r1]
bl sub_8009FCC
bl GetLinkPlayerCount
ldr r4, =gUnknown_02039F30
strb r0, [r4]
ldr r1, =gUnknown_02039F2A

View File

@ -492,7 +492,7 @@ sub_812287C: @ 812287C
bl Free
b _08122980
_081228B0:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
mov r9, r0

View File

@ -565,7 +565,7 @@ _0811A72C:
ldr r4, =gStringVar3
adds r0, r4, 0
movs r1, 0x2
bl sub_811F88C
bl InitializeEasyChatWordArray
b _0811A7C2
.pool
_0811A73C:
@ -3704,7 +3704,7 @@ sub_811BDF0: @ 811BDF0
ldrb r2, [r0]
mov r0, sp
adds r1, r5, 0
bl sub_81DB5E8
bl TVShowConvertInternationalString
movs r0, 0
mov r1, sp
bl sub_81AFC0C
@ -11109,8 +11109,8 @@ _0811F886:
bx r1
thumb_func_end sub_811F860
thumb_func_start sub_811F88C
sub_811F88C: @ 811F88C
thumb_func_start InitializeEasyChatWordArray
InitializeEasyChatWordArray: @ 811F88C
push {lr}
adds r2, r0, 0
lsls r1, 16
@ -11133,7 +11133,7 @@ _0811F8AE:
pop {r0}
bx r0
.pool
thumb_func_end sub_811F88C
thumb_func_end InitializeEasyChatWordArray
thumb_func_start sub_811F8BC
sub_811F8BC: @ 811F8BC

View File

@ -108,8 +108,8 @@ _080981E4:
.pool
thumb_func_end task_del_textbox
thumb_func_start box_related_two__2
box_related_two__2: @ 80981EC
thumb_func_start ShowFieldMessage
ShowFieldMessage: @ 80981EC
push {r4,lr}
adds r1, r0, 0
ldr r4, =gUnknown_020375BC
@ -130,7 +130,7 @@ _0809820E:
pop {r4}
pop {r1}
bx r1
thumb_func_end box_related_two__2
thumb_func_end ShowFieldMessage
thumb_func_start sub_8098214
sub_8098214: @ 8098214

View File

@ -217,7 +217,7 @@ _080F96FC:
ldrb r0, [r4, 0x2]
bl sub_80F95C0
ldr r0, =gText_PkmnFainted3
bl box_related_two__2
bl ShowFieldMessage
ldrh r0, [r4]
adds r0, 0x1
strh r0, [r4]

View File

@ -389,8 +389,8 @@ _081DB5E4:
bx r0
thumb_func_end sub_81DB5AC
thumb_func_start sub_81DB5E8
sub_81DB5E8: @ 81DB5E8
thumb_func_start TVShowConvertInternationalString
TVShowConvertInternationalString: @ 81DB5E8
push {r4,r5,lr}
adds r5, r0, 0
adds r4, r2, 0
@ -403,7 +403,7 @@ sub_81DB5E8: @ 81DB5E8
pop {r4,r5}
pop {r0}
bx r0
thumb_func_end sub_81DB5E8
thumb_func_end TVShowConvertInternationalString
thumb_func_start sub_81DB604
sub_81DB604: @ 81DB604

View File

@ -1371,8 +1371,8 @@ _08009FC4:
.pool
thumb_func_end sub_8009FAC
thumb_func_start sub_8009FCC
sub_8009FCC: @ 8009FCC
thumb_func_start GetLinkPlayerCount
GetLinkPlayerCount: @ 8009FCC
push {lr}
ldr r0, =gLinkVSyncDisabled
ldrb r0, [r0]
@ -1392,14 +1392,14 @@ _08009FEC:
_08009FF4:
pop {r1}
bx r1
thumb_func_end sub_8009FCC
thumb_func_end GetLinkPlayerCount
thumb_func_start sub_8009FF8
sub_8009FF8: @ 8009FF8
push {r4-r7,lr}
adds r6, r0, 0
adds r5, r1, 0
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r4, r0, 24
movs r2, 0
@ -1442,7 +1442,7 @@ sub_800A03C: @ 800A03C
thumb_func_start sub_800A040
sub_800A040: @ 800A040
push {lr}
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@ -1546,7 +1546,7 @@ _0800A0EA:
b _0800A22E
.pool
_0800A0FC:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
cmp r0, 0
bne _0800A10E
@ -1572,12 +1572,12 @@ _0800A130:
adds r5, 0x1C
adds r6, 0x1
_0800A134:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r6, r0
blt _0800A120
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r7, r0
@ -1714,12 +1714,12 @@ _0800A266:
lsls r0, 24
lsrs r4, r0, 24
_0800A26C:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
bcc _0800A24C
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r6, r0
@ -1742,8 +1742,8 @@ _0800A298:
.pool
thumb_func_end sub_800A23C
thumb_func_start sub_800A2A4
sub_800A2A4: @ 800A2A4
thumb_func_start GetLinkPlayerTrainerId
GetLinkPlayerTrainerId: @ 800A2A4
lsls r0, 24
lsrs r0, 24
ldr r2, =gLinkPlayers
@ -1755,7 +1755,7 @@ sub_800A2A4: @ 800A2A4
ldr r0, [r1]
bx lr
.pool
thumb_func_end sub_800A2A4
thumb_func_end GetLinkPlayerTrainerId
thumb_func_start sub_800A2BC
sub_800A2BC: @ 800A2BC
@ -2697,7 +2697,7 @@ _0800A9E2:
lsrs r4, r0, 24
adds r5, 0x1
_0800A9EE:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
@ -3044,7 +3044,7 @@ _0800AC96:
thumb_func_start sub_800ACAC
sub_800ACAC: @ 800ACAC
push {r4,lr}
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r2, r0, 24
movs r3, 0
@ -3142,7 +3142,7 @@ _0800AD72:
thumb_func_start sub_800AD88
sub_800AD88: @ 800AD88
push {r4,r5,lr}
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r3, r0, 24
movs r1, 0
@ -3239,7 +3239,7 @@ _0800AE46:
thumb_func_start sub_800AE5C
sub_800AE5C: @ 800AE5C
push {r4,lr}
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r2, r0, 24
movs r1, 0
@ -9671,7 +9671,7 @@ _0800E1C8:
lsls r0, 24
lsrs r5, r0, 24
_0800E1E6:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
subs r0, 0x1
@ -9965,7 +9965,7 @@ _0800E428:
ble _0800E3FC
mov r4, r9
_0800E434:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@ -10019,7 +10019,7 @@ _0800E4A6:
adds r5, 0x1C
adds r4, 0x1
_0800E4AC:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@ -13627,7 +13627,7 @@ sub_80102B8: @ 80102B8
bl sub_800FD14
strh r4, [r5]
_080102E6:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r2, r0, 24
movs r1, 0
@ -13734,7 +13734,7 @@ sub_8010390: @ 8010390
b _0801041C
.pool
_080103CC:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r2, r0, 24
movs r1, 0x1
@ -15290,7 +15290,7 @@ _08011048:
strb r0, [r1, 0x3]
adds r4, 0x1
_08011054:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@ -20950,12 +20950,12 @@ _08014138:
adds r5, 0x1C
adds r4, 0x1
_08014152:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
blt _08014138
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x2
@ -21159,7 +21159,7 @@ sub_8014304: @ 8014304
strh r1, [r0]
ldr r0, =0x00004087
bl VarSet
bl sub_8009FCC
bl GetLinkPlayerCount
ldr r1, =gUnknown_03005DB8
strb r0, [r1]
bl GetMultiplayerId
@ -39697,7 +39697,7 @@ sub_801DDD0: @ 801DDD0
strb r5, [r4, 0x16]
movs r0, 0xFF
strb r0, [r4, 0x1A]
bl sub_8009FCC
bl GetLinkPlayerCount
strb r0, [r4, 0xD]
bl GetMultiplayerId
strb r0, [r4, 0x13]
@ -42285,7 +42285,7 @@ _0801F30A:
movs r0, 0x1
strh r0, [r4]
_0801F30E:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
adds r2, r0, 0
@ -42446,7 +42446,7 @@ _0801F448:
ldrsh r0, [r4, r3]
cmp r0, 0
beq _0801F47C
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x2
@ -45504,7 +45504,7 @@ _08020C8E:
b _08020CF8
.pool
_08020CAC:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
mov r8, r0
@ -53271,7 +53271,7 @@ _08024B2C:
_08024B6A:
ldr r0, [sp, 0x10]
strb r1, [r0]
bl sub_8009FCC
bl GetLinkPlayerCount
mov r1, r8
strb r0, [r1]
bl GetMultiplayerId
@ -57700,7 +57700,7 @@ _08026EF6:
adds r4, 0xC
adds r5, 0x1
_08026EFE:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
@ -59511,7 +59511,7 @@ _08027C76:
thumb_func_start sub_8027D20
sub_8027D20: @ 8027D20
push {lr}
bl sub_8009FCC
bl GetLinkPlayerCount
ldr r1, =gUnknown_02022C98
ldr r1, [r1]
adds r1, 0x24
@ -64891,7 +64891,7 @@ sub_802AA48: @ 802AA48
sub_802AA60: @ 802AA60
push {r4,lr}
adds r4, r0, 0
bl sub_8009FCC
bl GetLinkPlayerCount
movs r2, 0
strb r0, [r4, 0x5]
adds r1, r4, 0
@ -68775,7 +68775,7 @@ _0802C8A4:
thumb_func_start sub_802C8AC
sub_802C8AC: @ 802C8AC
push {lr}
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
pop {r1}

View File

@ -1392,7 +1392,7 @@ _08120BB0:
movs r0, 0xFF
strb r0, [r7, 0x7]
mov r0, sp
bl sub_8009228
bl IsStringJapanese
cmp r0, 0
beq _08120BF8
mov r0, sp
@ -1458,7 +1458,7 @@ _08120C48:
muls r0, r5
adds r0, 0x5
adds r0, r6, r0
bl sub_8009228
bl IsStringJapanese
cmp r0, 0
beq _08120C5E
mov r0, r8
@ -1480,7 +1480,7 @@ _08120C6A:
movs r5, 0x3
_08120C74:
adds r0, r6, 0
bl sub_8009228
bl IsStringJapanese
cmp r0, 0
beq _08120C84
mov r1, r8
@ -1569,7 +1569,7 @@ _08120CF2:
mov r1, r8
strb r0, [r1, 0x7]
mov r0, sp
bl sub_8009228
bl IsStringJapanese
cmp r0, 0
beq _08120D1A
movs r0, 0x1
@ -2205,7 +2205,7 @@ sub_8121178: @ 8121178
bl ConvertInternationalString
mov r0, r8
bl sub_8120EC0
bl box_related_two__2
bl ShowFieldMessage
pop {r3}
mov r8, r3
pop {r4-r6}

View File

@ -6514,7 +6514,7 @@ sub_81C3220: @ 81C3220
b _081C3282
.pool
_081C326C:
bl sub_80F0020
bl GetPlayerIDAsU32
adds r4, r0, 0
ldr r0, =0x0000ffff
ands r4, r0

View File

@ -1162,7 +1162,7 @@ _080E7714:
lsrs r0, 24
mov r8, r0
_080E771C:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r8, r0
@ -1179,7 +1179,7 @@ _080E771C:
adds r1, 0x1
strh r1, [r0, 0x8]
_080E773E:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
ldr r4, [sp, 0x8]
@ -1312,7 +1312,7 @@ sub_80E7820: @ 80E7820
sub_80E7830: @ 80E7830
push {r4,lr}
adds r4, r0, 0
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x3
@ -1341,7 +1341,7 @@ _080E7856:
.pool
_080E7868:
movs r0, 0
bl sub_800A2A4
bl GetLinkPlayerTrainerId
adds r2, r0, 0
movs r0, 0x1
ands r2, r0
@ -1362,7 +1362,7 @@ _080E7880:
.pool
_080E7894:
movs r0, 0
bl sub_800A2A4
bl GetLinkPlayerTrainerId
movs r1, 0x9
bl __umodsi3
adds r2, r0, 0
@ -1523,7 +1523,7 @@ _080E79CE:
adds r4, r1, 0
adds r4, 0x20
adds r0, r4, 0
bl sub_8009228
bl IsStringJapanese
cmp r0, 0
beq _080E79F2
adds r0, r4, 0
@ -1738,7 +1738,7 @@ sub_80E7B60: @ 80E7B60
ldr r0, =gLinkPlayers
ldrh r0, [r0, 0x4]
bl SeedRng2
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r4, r0, 24
movs r0, 0
@ -1878,7 +1878,7 @@ _080E7C9A:
bne _080E7CEE
adds r0, r5, 0
adds r0, 0x24
bl sub_8009228
bl IsStringJapanese
cmp r0, 0
beq _080E7CBA
adds r0, r5, 0
@ -1901,7 +1901,7 @@ _080E7CC6:
adds r4, r0, 0
adds r0, r5, 0
adds r0, 0x2C
bl sub_8009228
bl IsStringJapanese
cmp r0, 0
beq _080E7CE2
ldrb r0, [r4]
@ -1931,7 +1931,7 @@ _080E7CFA:
lsrs r0, 16
mov r8, r0
_080E7D04:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r8, r0
@ -3557,7 +3557,7 @@ sub_80E89AC: @ 80E89AC
adds r6, r0, 0
mov r8, r1
mov r9, r2
bl sub_8009FCC
bl GetLinkPlayerCount
adds r4, r0, 0
lsls r4, 24
lsrs r4, 24

View File

@ -125,7 +125,7 @@ _08184EAC:
bl GetMultiplayerId
ldr r1, =gUnknown_0203C7B4
strb r0, [r1]
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
mov r10, r0
@ -505,7 +505,7 @@ _081851D0:
adds r4, 0x1C
adds r5, 0x1
_081851DA:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0

View File

@ -1963,7 +1963,7 @@ _08033726:
lsls r0, r1, 24
lsrs r4, r0, 24
_0803372C:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r4, r0
@ -3259,8 +3259,8 @@ _0803413E:
.pool
thumb_func_end sub_8034110
thumb_func_start dp01_build_cmdbuf_x21_a_bb
dp01_build_cmdbuf_x21_a_bb: @ 8034158
thumb_func_start EmitCmd_x21
EmitCmd_x21: @ 8034158
push {r4,lr}
adds r4, r1, 0
lsls r0, 24
@ -3280,7 +3280,7 @@ dp01_build_cmdbuf_x21_a_bb: @ 8034158
pop {r0}
bx r0
.pool
thumb_func_end dp01_build_cmdbuf_x21_a_bb
thumb_func_end EmitCmd_x21
thumb_func_start dp01_build_cmdbuf_x22_a_three_bytes
dp01_build_cmdbuf_x22_a_three_bytes: @ 8034184

View File

@ -4121,7 +4121,7 @@ _081377BC:
add r2, sp, 0x18
bl SetMonData
adds r0, r4, 0
bl sub_80EE5A4
bl GetRibbonCount
strb r0, [r5, 0x1]
movs r7, 0x1
_0813780A:
@ -4629,7 +4629,7 @@ sub_8137C10: @ 8137C10
ldr r0, =gSpecialVar_0x8004
ldrh r0, [r0]
bl sub_8137A98
bl box_related_two__2
bl ShowFieldMessage
pop {r0}
bx r0
.pool
@ -5399,13 +5399,13 @@ sub_8138240: @ 8138240
bl GetMultiplayerId
lsls r0, 24
lsrs r7, r0, 24
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r5, r0, 24
movs r4, 0
cmp r4, r5
bcs _0813828A
ldr r0, =gUnknown_0858D144
ldr r0, =gTVStringVarPtrs
mov r8, r0
_08138262:
cmp r7, r4
@ -6378,7 +6378,7 @@ sub_8138AA4: @ 8138AA4
sub_8138AC0: @ 8138AC0
push {lr}
ldr r0, =gStringVar4
bl box_related_two__2
bl ShowFieldMessage
pop {r0}
bx r0
.pool
@ -6537,7 +6537,7 @@ _08138BF6:
thumb_func_start sub_8138C04
sub_8138C04: @ 8138C04
push {r4,lr}
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7060,7 +7060,7 @@ sub_8138FEC: @ 8138FEC
thumb_func_start sub_8139004
sub_8139004: @ 8139004
push {lr}
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7084,7 +7084,7 @@ _0813902A:
thumb_func_start sub_8139030
sub_8139030: @ 8139030
push {lr}
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7108,7 +7108,7 @@ _08139056:
thumb_func_start sub_813905C
sub_813905C: @ 813905C
push {lr}
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7132,7 +7132,7 @@ _08139082:
thumb_func_start sub_8139088
sub_8139088: @ 8139088
push {lr}
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7156,7 +7156,7 @@ _081390AE:
thumb_func_start sub_81390B4
sub_81390B4: @ 81390B4
push {lr}
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7295,7 +7295,7 @@ RemoveScriptFieldObject: @ 81391AC
thumb_func_start sub_81391D0
sub_81391D0: @ 81391D0
push {lr}
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7479,7 +7479,7 @@ _08139342:
thumb_func_start sub_8139348
sub_8139348: @ 8139348
push {lr}
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7507,7 +7507,7 @@ sub_8139370: @ 8139370
movs r1, 0x1
mov r0, sp
strb r1, [r0]
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7519,7 +7519,7 @@ sub_8139370: @ 8139370
mov r2, sp
bl SetMonData
adds r0, r4, 0
bl sub_80EE5A4
bl GetRibbonCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4
@ -7538,7 +7538,7 @@ _081393B6:
thumb_func_start sub_81393C8
sub_81393C8: @ 81393C8
push {lr}
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64
@ -7882,8 +7882,8 @@ _08139684:
bx r0
thumb_func_end sub_8139668
thumb_func_start sub_8139688
sub_8139688: @ 8139688
thumb_func_start GetIdxOfFirstPartyMemberThatIsNotAnEgg
GetIdxOfFirstPartyMemberThatIsNotAnEgg: @ 8139688
push {r4-r6,lr}
bl CalculatePlayerPartyCount
lsls r0, 24
@ -7926,7 +7926,7 @@ _081396D8:
pop {r4-r6}
pop {r1}
bx r1
thumb_func_end sub_8139688
thumb_func_end GetIdxOfFirstPartyMemberThatIsNotAnEgg
thumb_func_start sub_81396E0
sub_81396E0: @ 81396E0
@ -8050,7 +8050,7 @@ sub_81397C4: @ 81397C4
cmp r1, r0
bls _081397E0
movs r0, 0
bl sub_80EF340
bl TV_PrintIntToStringVar
b _08139862
.pool
_081397E0:
@ -9094,7 +9094,7 @@ _0813A062:
lsls r0, 2
adds r0, r7
ldr r0, [r0]
bl box_related_two__2
bl ShowFieldMessage
pop {r4-r7}
pop {r0}
bx r0
@ -9996,7 +9996,7 @@ _0813A7C6:
lsrs r0, 22
adds r0, r1
ldr r0, [r0]
bl box_related_two__2
bl ShowFieldMessage
pop {r0}
bx r0
.pool
@ -10036,7 +10036,7 @@ sub_813A820: @ 813A820
lsls r0, r4, 2
adds r0, r1
ldr r0, [r0]
bl box_related_two__2
bl ShowFieldMessage
ldr r0, =0x00004031
adds r1, r4, 0
bl VarSet
@ -10056,7 +10056,7 @@ sub_813A854: @ 813A854
lsrs r0, 14
adds r0, r4
ldr r0, [r0]
bl box_related_two__2
bl ShowFieldMessage
pop {r4}
pop {r0}
bx r0

View File

@ -3267,7 +3267,7 @@ s67_execute_box: @ 809ABD4
bne _0809ABE2
ldr r0, [r4, 0x64]
_0809ABE2:
bl box_related_two__2
bl ShowFieldMessage
movs r0, 0
pop {r4}
pop {r1}
@ -3793,7 +3793,7 @@ sBD_virtual_message: @ 809AFA0
ldr r1, =gUnknown_020375C4
ldr r1, [r1]
subs r0, r1
bl box_related_two__2
bl ShowFieldMessage
movs r0, 0
pop {r1}
bx r1
@ -3841,7 +3841,7 @@ s7E_load_first_pokenames: @ 809AFFC
lsls r2, 2
adds r2, r0
ldr r4, [r2]
bl sub_8139688
bl GetIdxOfFirstPartyMemberThatIsNotAnEgg
lsls r0, 24
lsrs r0, 24
movs r1, 0x64

View File

@ -222,7 +222,7 @@ sub_80F8970: @ 80F8970
mov r12, r0
ldr r1, =gSpecialVar_0x8006
mov r9, r1
ldr r2, =gUnknown_02039E02
ldr r2, =gUnknown_02039E00 + 2
mov r10, r2
mov r2, r12
mov r1, sp
@ -625,7 +625,7 @@ sub_80F8C7C: @ 80F8C7C
ldrb r0, [r6]
muls r0, r5
adds r0, r4
bl sub_80EE5A4
bl GetRibbonCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x4

View File

@ -4494,7 +4494,7 @@ sub_80EAF80: @ 80EAF80
bne _080EAF9A
b _080EB16A
_080EAF9A:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r0, 0x2

View File

@ -6603,7 +6603,7 @@ _0807A97C:
adds r4, 0x1C
adds r5, 0x1
_0807A980:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0
@ -6632,7 +6632,7 @@ _0807A9B0:
adds r4, 0x1C
adds r5, 0x1
_0807A9B4:
bl sub_8009FCC
bl GetLinkPlayerCount
lsls r0, 24
lsrs r0, 24
cmp r5, r0

16938
asm/tv.s

File diff suppressed because it is too large Load Diff

4
common_syms/tv.txt Normal file
View File

@ -0,0 +1,4 @@
sCurTVShowSlot
sTV_SecretBaseVisitMovesTemp
sTV_DecorationsBuffer
sTV_SecretBaseVisitMonsTemp

View File

@ -822,7 +822,15 @@ gUnknown_0827EE09:: @ 27EE09
.incbin "baserom.gba", 0x27ee09, 0x2
gUnknown_0827EE0B:: @ 827EE0B
.incbin "baserom.gba", 0x27ee0b, 0x118fa
.incbin "baserom.gba", 0x27ee0b, 0x46a
.include "data/text/tv.inc"
.incbin "baserom.gba", 0x0028c7e9, 0x90f
.include "data/text/pokemon_news.inc"
.incbin "baserom.gba", 0x28e066, 0x269f
gUnknown_08290705:: @ 8290705
.incbin "baserom.gba", 0x290705, 0xeb

165
data/text/pokemon_news.inc Normal file
View File

@ -0,0 +1,165 @@
gPokeNewsTextSlateport_Upcoming:: @ 0828D0F8
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "SLATEPORTs most popular kind of guy,\n"
.string "the ENERGY GURU, is in the news again!\p"
.string "He promises to, “Stupendously go for\n"
.string "it in just this many days: {STR_VAR_1}!”\p"
.string "While he refused to elaborate on what\n"
.string "he will stupendously go for, the\l"
.string "ENERGY GURU advised, “Save up your\l"
.string "money. Thatll be good…”\p"
.string "It sounds like a trip to SLATEPORT\n"
.string "would be well worth your while that day.\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextSlateport_Ongoing:: @ 0828D2A1
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "This is the news youve all been\n"
.string "waiting for!\p"
.string "SLATEPORTS ENERGY GURU is going\n"
.string "for it stupendously in the MARKET!\p"
.string "He promises unbeatable bargain\n"
.string "prices on CALCIUM and PROTEIN!\p"
.string "A trip to SLATEPORT CITY sounds\n"
.string "worthwhile. Why not visit and shop\l"
.string "to your hearts content?\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextSlateport_Ending:: @ 0828D3F5
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "This is the news youve all been\n"
.string "waiting for!\p"
.string "SLATEPORTS ENERGY GURU is going\n"
.string "for it stupendously in the MARKET!\p"
.string "He promises unbeatable bargain\n"
.string "prices on CALCIUM and PROTEIN!\p"
.string "According to the ENERGY GURU, he\n"
.string "still has ample merchandise left.\p"
.string "Why not visit SLATEPORT CITY for\n"
.string "a most enjoyable shopping trip?\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextGameCorner_Upcoming:: @ 0828D571
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "Its approaching!\n"
.string "Its finally coming!\p"
.string "The GAME CORNERs service day will be\n"
.string "here in just this many days: {STR_VAR_1}!\p"
.string "Even those who are usually unlucky\n"
.string "may be lucky on this particular day!\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextGameCorner_Ongoing:: @ 0828D66F
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "Its here!\n"
.string "Its finally arrived!\p"
.string "GAME CORNERs service day has finally\n"
.string "arrived!\p"
.string "Could you be lucky at the SLOTS \n"
.string "and ROULETTE?\p"
.string "The location is MAUVILLE CITY.\n"
.string "This is the place!\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextGameCorner_Ending:: @ 0828D768
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "Its here!\n"
.string "Its finally arrived!\p"
.string "GAME CORNERs service day has finally\n"
.string "arrived!\p"
.string "Could you be lucky at the SLOTS\n"
.string "and ROULETTE?\p"
.string "Time is limited and has almost run out.\n"
.string "The location is MAUVILLE CITY.\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextLilycove_Upcoming:: @ 0828D875
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "Weve just received wonderful news\n"
.string "from LILYCOVE DEPARTMENT STORE.\p"
.string "The DEPARTMENT STOREs clear-out sale\n"
.string "will be in just this many days: {STR_VAR_1}!\p"
.string "That thingamajig or that doodad that\n"
.string "youve always wanted could be yours!\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextLilycove_Ongoing:: @ 0828D994
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "This is the news youve all been\n"
.string "waiting for!\p"
.string "LILYCOVE DEPARTMENT STOREs clear-out\n"
.string "sale has finally arrived!\p"
.string "All the thingamajigs and doodads that\n"
.string "youve always dreamt about…\p"
.string "You may be in for fateful encounters\n"
.string "with them all!\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextLilycove_Ending:: @ 0828DAC0
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "This is the news youve all been\n"
.string "waiting for!\p"
.string "LILYCOVE DEPARTMENT STOREs clear-out\n"
.string "sale has finally arrived!\p"
.string "All the thingamajigs and doodads that\n"
.string "youve always dreamt about…\p"
.string "You may be in for fateful encounters\n"
.string "with them all!\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextBlendMaster_Upcoming:: @ 0828DBEC
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "We have big news for everyone\n"
.string "involved in the making of {POKEBLOCK}S.\p"
.string "The legendary BLEND MASTER will be\n"
.string "appearing in LILYCOVE CITY with just\l"
.string "a mere {STR_VAR_1}-day wait to go!\p"
.string "The BLEND MASTER is said to be\n"
.string "the best in all HOENN when it comes to\l"
.string "spinning a BERRY BLENDER.\p"
.string "Those people who want to make great\n"
.string "{POKEBLOCK}S or see the MASTER in action\l"
.string "are urged to save their BERRIES.\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextBlendMaster_Ongoing:: @ 0828DD9E
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "We have big news for everyone\n"
.string "involved in the making of {POKEBLOCK}S.\p"
.string "The legendary BLEND MASTER has\n"
.string "finally appeared!\p"
.string "The BLEND MASTER is spinning\n"
.string "the BERRY BLENDER at the LILYCOVE\l"
.string "CONTEST HALL.\p"
.string "Those people who want to make great\n"
.string "{POKEBLOCK}S or see the MASTER in action\l"
.string "should hurry to LILYCOVE.\p"
.string "Thats the news on POKéMON NEWS.$"
gPokeNewsTextBlendMaster_Ending:: @ 0828DF05
.string "Greetings!\n"
.string "Its time for POKéMON NEWS.\p"
.string "Its incredible!\n"
.string "Too incredible, even!\p"
.string "The BERRY BLENDER is spinning at\n"
.string "a dizzying pace!\p"
.string "The BLEND MASTER has lived up to\n"
.string "his reputation!\p"
.string "The BLEND MASTER will soon be\n"
.string "leaving LILYCOVE.\p"
.string "If you havent seen the MASTER in\n"
.string "action, dont waste this chance!\l"
.string "Head to LILYCOVE right now!\p"
.string "Thats the news on POKéMON NEWS.$"

2891
data/text/tv.inc Normal file

File diff suppressed because it is too large Load Diff

128
data/tv.s
View File

@ -1,128 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2, 0
gUnknown_0858D094:: @ 858D094
.incbin "baserom.gba", 0x58d094, 0x3c
gUnknown_0858D0D0:: @ 858D0D0
.incbin "baserom.gba", 0x58d0d0, 0xe
gUnknown_0858D0DE:: @ 858D0DE
.incbin "baserom.gba", 0x58d0de, 0xe
gUnknown_0858D0EC:: @ 858D0EC
.incbin "baserom.gba", 0x58d0ec, 0x1c
gUnknown_0858D108:: @ 858D108
.incbin "baserom.gba", 0x58d108, 0x14
gUnknown_0858D11C:: @ 858D11C
.incbin "baserom.gba", 0x58d11c, 0x14
gUnknown_0858D130:: @ 858D130
.incbin "baserom.gba", 0x58d130, 0x14
gUnknown_0858D144:: @ 858D144
.incbin "baserom.gba", 0x58d144, 0xc
gUnknown_0858D150:: @ 858D150
.incbin "baserom.gba", 0x58d150, 0x20
gUnknown_0858D170:: @ 858D170
.incbin "baserom.gba", 0x58d170, 0x18
gUnknown_0858D188:: @ 858D188
.incbin "baserom.gba", 0x58d188, 0x14
gUnknown_0858D19C:: @ 858D19C
.incbin "baserom.gba", 0x58d19c, 0x4
gUnknown_0858D1A0:: @ 858D1A0
.incbin "baserom.gba", 0x58d1a0, 0x30
gUnknown_0858D1D0:: @ 858D1D0
.incbin "baserom.gba", 0x58d1d0, 0x34
gUnknown_0858D204:: @ 858D204
.incbin "baserom.gba", 0x58d204, 0x24
gUnknown_0858D228:: @ 858D228
.incbin "baserom.gba", 0x58d228, 0x18
gUnknown_0858D240:: @ 858D240
.incbin "baserom.gba", 0x58d240, 0x3c
gUnknown_0858D27C:: @ 858D27C
.incbin "baserom.gba", 0x58d27c, 0x84
gUnknown_0858D300:: @ 858D300
.incbin "baserom.gba", 0x58d300, 0x20
gUnknown_0858D320:: @ 858D320
.incbin "baserom.gba", 0x58d320, 0x18
gUnknown_0858D338:: @ 858D338
.incbin "baserom.gba", 0x58d338, 0x4c
gUnknown_0858D384:: @ 858D384
.incbin "baserom.gba", 0x58d384, 0x10
gUnknown_0858D394:: @ 858D394
.incbin "baserom.gba", 0x58d394, 0x1c
gUnknown_0858D3B0:: @ 858D3B0
.incbin "baserom.gba", 0x58d3b0, 0x8
gUnknown_0858D3B8:: @ 858D3B8
.incbin "baserom.gba", 0x58d3b8, 0xc
gUnknown_0858D3C4:: @ 858D3C4
.incbin "baserom.gba", 0x58d3c4, 0x2c
gUnknown_0858D3F0:: @ 858D3F0
.incbin "baserom.gba", 0x58d3f0, 0x1c
gUnknown_0858D40C:: @ 858D40C
.incbin "baserom.gba", 0x58d40c, 0xc
gUnknown_0858D418:: @ 858D418
.incbin "baserom.gba", 0x58d418, 0x10
gUnknown_0858D428:: @ 858D428
.incbin "baserom.gba", 0x58d428, 0x34
gUnknown_0858D45C:: @ 858D45C
.incbin "baserom.gba", 0x58d45c, 0x38
gUnknown_0858D494:: @ 858D494
.incbin "baserom.gba", 0x58d494, 0x4
gUnknown_0858D498:: @ 858D498
.incbin "baserom.gba", 0x58d498, 0x1c
gUnknown_0858D4B4:: @ 858D4B4
.incbin "baserom.gba", 0x58d4b4, 0x30
gUnknown_0858D4E4:: @ 858D4E4
.incbin "baserom.gba", 0x58d4e4, 0x40
gUnknown_0858D524:: @ 858D524
.incbin "baserom.gba", 0x58d524, 0x4c
gUnknown_0858D570:: @ 858D570
.incbin "baserom.gba", 0x58d570, 0x24
gUnknown_0858D594:: @ 858D594
.incbin "baserom.gba", 0x58d594, 0xac
gUnknown_0858D640:: @ 858D640
.incbin "baserom.gba", 0x58d640, 0x2c
gUnknown_0858D66C:: @ 858D66C
.incbin "baserom.gba", 0x58d66c, 0x24
gUnknown_0858D690:: @ 858D690
.incbin "baserom.gba", 0x58d690, 0x20

View File

@ -5,6 +5,7 @@
#include "battle_util.h"
#include "battle_script_commands.h"
#include "battle_2.h"
#include "battle_ai_switch_items.h"
/*
Banks are a name given to what could be called a 'battlerId' or 'monControllerId'.
@ -77,6 +78,7 @@
#define BATTLE_PLAYER_TELEPORTED 0x5
#define BATTLE_POKE_FLED 0x6
#define BATTLE_CAUGHT 0x7
#define BATTLE_SAFARI_OUT_OF_BALLS 0x8
#define BATTLE_FORFEITED 0x9
#define BATTLE_OPPONENT_TELEPORTED 0xA
@ -476,7 +478,7 @@ struct BattleHistory
struct UsedMoves usedMoves[BATTLE_BANKS_COUNT];
u8 abilities[BATTLE_BANKS_COUNT];
u8 itemEffects[BATTLE_BANKS_COUNT];
u16 TrainerItems[BATTLE_BANKS_COUNT];
u16 trainerItems[BATTLE_BANKS_COUNT];
u8 itemsNo;
};
@ -527,11 +529,11 @@ struct BattleResults
u8 playerSwitchesCounter; // 0x2
u8 unk3; // 0x3
u8 unk4; // 0x4
u8 unk5_0:1; // 0x5 , 0x1
u8 unk5_1:1; // 0x5 , 0x2
u8 caughtMonBall:4; // 0x5 , 0x4/0x8/0x10/0x20
u8 unk5_6:1; // 0x5 , 0x40
u8 unk5_7:1; // 0x5 , 0x80
u8 unk5_0:1; // 0x5
u8 usedMasterBall:1; // 0x5
u8 caughtMonBall:4; // 0x5
u8 unk5_6:1; // 0x5
u8 unk5_7:1; // 0x5
u16 playerMon1Species; // 0x6
u8 playerMon1Name[11]; // 0x8
u8 battleTurnCounter; // 0x13
@ -544,7 +546,7 @@ struct BattleResults
u16 caughtMonSpecies; // 0x28
u8 caughtMonNick[10]; // 0x2A
u8 filler34[2];
u8 catchAttempts[12]; // 0x36
u8 catchAttempts[11]; // 0x36
};
extern struct BattleResults gBattleResults;
@ -632,8 +634,8 @@ struct BattleStruct
void (*savedCallback)(void);
u16 usedHeldItems[BATTLE_BANKS_COUNT];
u8 field_C0[4];
u8 field_C4[2];
u8 field_C6[2];
u8 AI_itemType[2];
u8 AI_itemFlags[2];
u16 choicedMove[BATTLE_BANKS_COUNT];
u16 changedItems[BATTLE_BANKS_COUNT];
u8 intimidateBank;
@ -901,6 +903,10 @@ struct MonSpritesGfx
struct SpriteTemplate templates[4];
};
extern struct BattleSpritesGfx* gMonSpritesGfx;
extern u8 gBattleOutcome;
extern u16 gLastUsedItem;
extern u32 gBattleTypeFlags;
extern struct MonSpritesGfx* gMonSpritesGfxPtr;
#endif // GUARD_BATTLE_H

View File

@ -0,0 +1,17 @@
#ifndef GUARD_BATTLE_AI_SWITCH_ITEMS_H
#define GUARD_BATTLE_AI_SWITCH_ITEMS_H
enum
{
AI_ITEM_FULL_RESTORE = 1,
AI_ITEM_HEAL_HP,
AI_ITEM_CURE_CONDITION,
AI_ITEM_X_STAT,
AI_ITEM_GUARD_SPECS,
AI_ITEM_NOT_RECOGNIZABLE
};
void AI_TrySwitchOrUseItem(void);
u8 GetMostSuitableMonToSwitchInto(void);
#endif // GUARD_BATTLE_AI_SWITCH_ITEMS_H

View File

@ -84,5 +84,6 @@ void Emit_x32(u8 bufferId);
void EmitPrintString(u8 bufferId, u16 stringId);
void EmitResetActionMoveSelection(u8 bufferId, u8 caseId);
void EmitBallThrow(u8 bufferId, u8 caseId);
void EmitCmd_x21(u8 bufferId, u8 arg1, u16 arg2);
#endif // GUARD_BATTLE_CONTROLLERS_H

View File

@ -43,7 +43,7 @@
void AI_CalcDmg(u8 bankAtk, u8 bankDef);
u8 TypeCalc(u16 move, u8 bankAtk, u8 bankDef);
u8 AI_TypeCalc(u16 move, u16 species, u8 ability);
u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility);
u8 BankGetTurnOrder(u8 bank);
void SetMoveEffect(bool8 primary, u8 certain);
void BattleDestroyCursorAt(u8 cursorPosition);

6
include/battle_tower.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef GUARD_BATTLE_TOWER_H
#define GUARD_BATTLE_TOWER_H
u16 sub_8164FCC(u8, u8);
#endif //GUARD_BATTLE_TOWER_H

18
include/contest.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef GUARD_CONTEST_H
#define GUARD_CONTEST_H
struct ContestStruct_02039E00 {
u16 unk_00;
u8 unk_02[11];
u8 unk_0d[8];
u8 filler_15[9];
u8 filler_1E[34];
};
extern struct ContestStruct_02039E00 gUnknown_02039E00[4];
extern u8 gUnknown_02039F24;
extern EWRAM_DATA u16 gUnknown_02039F2C;
extern EWRAM_DATA u8 gUnknown_02039F2E;
extern EWRAM_DATA u8 gUnknown_02039F30;
#endif //GUARD_CONTEST_H

147
include/decoration.h Normal file
View File

@ -0,0 +1,147 @@
#ifndef GUARD_DECORATION_H
#define GUARD_DECORATION_H
enum DecoId {
/*000*/ DECOR_NONE,
/*001*/ DECOR_SMALL_DESK,
/*002*/ DECOR_POKEMON_DESK,
/*003*/ DECOR_HEAVY_DESK,
/*004*/ DECOR_RAGGED_DESK,
/*005*/ DECOR_COMFORT_DESK,
/*006*/ DECOR_PRETTY_DESK,
/*007*/ DECOR_BRICK_DESK,
/*008*/ DECOR_CAMP_DESK,
/*009*/ DECOR_HARD_DESK,
/*010*/ DECOR_SMALL_CHAIR,
/*011*/ DECOR_POKEMON_CHAIR,
/*012*/ DECOR_HEAVY_CHAIR,
/*013*/ DECOR_PRETTY_CHAIR,
/*014*/ DECOR_COMFORT_CHAIR,
/*015*/ DECOR_RAGGED_CHAIR,
/*016*/ DECOR_BRICK_CHAIR,
/*017*/ DECOR_CAMP_CHAIR,
/*018*/ DECOR_HARD_CHAIR,
/*019*/ DECOR_RED_PLANT,
/*020*/ DECOR_TROPICAL_PLANT,
/*021*/ DECOR_PRETTY_FLOWERS,
/*022*/ DECOR_COLORFUL_PLANT,
/*023*/ DECOR_BIG_PLANT,
/*024*/ DECOR_GORGEOUS_PLANT,
/*025*/ DECOR_RED_BRICK,
/*026*/ DECOR_YELLOW_BRICK,
/*027*/ DECOR_BLUE_BRICK,
/*028*/ DECOR_RED_BALLOON,
/*029*/ DECOR_BLUE_BALLOON,
/*030*/ DECOR_YELLOW_BALLOON,
/*031*/ DECOR_RED_TENT,
/*032*/ DECOR_BLUE_TENT,
/*033*/ DECOR_SOLID_BOARD,
/*034*/ DECOR_SLIDE,
/*035*/ DECOR_FENCE_LENGTH,
/*036*/ DECOR_FENCE_WIDTH,
/*037*/ DECOR_TIRE,
/*038*/ DECOR_STAND,
/*039*/ DECOR_MUD_BALL,
/*040*/ DECOR_BREAKABLE_DOOR,
/*041*/ DECOR_SAND_ORNAMENT,
/*042*/ DECOR_SILVER_SHIELD,
/*043*/ DECOR_GOLD_SHIELD,
/*044*/ DECOR_GLASS_ORNAMENT,
/*045*/ DECOR_TV,
/*046*/ DECOR_ROUND_TV,
/*047*/ DECOR_CUTE_TV,
/*048*/ DECOR_GLITTER_MAT,
/*049*/ DECOR_JUMP_MAT,
/*050*/ DECOR_SPIN_MAT,
/*051*/ DECOR_C_LOW_NOTE_MAT,
/*052*/ DECOR_D_NOTE_MAT,
/*053*/ DECOR_E_NOTE_MAT,
/*054*/ DECOR_F_NOTE_MAT,
/*055*/ DECOR_G_NOTE_MAT,
/*056*/ DECOR_A_NOTE_MAT,
/*057*/ DECOR_B_NOTE_MAT,
/*058*/ DECOR_C_HIGH_NOTE_MAT,
/*059*/ DECOR_SURF_MAT,
/*060*/ DECOR_THUNDER_MAT,
/*061*/ DECOR_FIRE_BLAST_MAT,
/*062*/ DECOR_POWDER_SNOW_MAT,
/*063*/ DECOR_ATTRACT_MAT,
/*064*/ DECOR_FISSURE_MAT,
/*065*/ DECOR_SPIKES_MAT,
/*066*/ DECOR_BALL_POSTER,
/*067*/ DECOR_GREEN_POSTER,
/*068*/ DECOR_RED_POSTER,
/*069*/ DECOR_BLUE_POSTER,
/*070*/ DECOR_CUTE_POSTER,
/*071*/ DECOR_PIKA_POSTER,
/*072*/ DECOR_LONG_POSTER,
/*073*/ DECOR_SEA_POSTER,
/*074*/ DECOR_SKY_POSTER,
/*075*/ DECOR_KISS_POSTER,
/*076*/ DECOR_PICHU_DOLL,
/*077*/ DECOR_PIKACHU_DOLL,
/*078*/ DECOR_MARILL_DOLL,
/*079*/ DECOR_TOGEPI_DOLL,
/*080*/ DECOR_CYNDAQUIL_DOLL,
/*081*/ DECOR_CHIKORITA_DOLL,
/*082*/ DECOR_TOTODILE_DOLL,
/*083*/ DECOR_JIGGLYPUFF_DOLL,
/*084*/ DECOR_MEOWTH_DOLL,
/*085*/ DECOR_CLEFAIRY_DOLL,
/*086*/ DECOR_DITTO_DOLL,
/*087*/ DECOR_SMOOCHUM_DOLL,
/*088*/ DECOR_TREECKO_DOLL,
/*089*/ DECOR_TORCHIC_DOLL,
/*090*/ DECOR_MUDKIP_DOLL,
/*091*/ DECOR_DUSKULL_DOLL,
/*092*/ DECOR_WYNAUT_DOLL,
/*093*/ DECOR_BALTOY_DOLL,
/*094*/ DECOR_KECLEON_DOLL,
/*095*/ DECOR_AZURILL_DOLL,
/*096*/ DECOR_SKITTY_DOLL,
/*097*/ DECOR_SWABLU_DOLL,
/*098*/ DECOR_GULPIN_DOLL,
/*099*/ DECOR_LOTAD_DOLL,
/*100*/ DECOR_SEEDOT_DOLL,
/*101*/ DECOR_PIKA_CUSHION,
/*102*/ DECOR_ROUND_CUSHION,
/*103*/ DECOR_KISS_CUSHION,
/*104*/ DECOR_ZIGZAG_CUSHION,
/*105*/ DECOR_SPIN_CUSHION,
/*106*/ DECOR_DIAMOND_CUSHION,
/*107*/ DECOR_BALL_CUSHION,
/*108*/ DECOR_GRASS_CUSHION,
/*109*/ DECOR_FIRE_CUSHION,
/*110*/ DECOR_WATER_CUSHION,
/*111*/ DECOR_SNORLAX_DOLL,
/*112*/ DECOR_RHYDON_DOLL,
/*113*/ DECOR_LAPRAS_DOLL,
/*114*/ DECOR_VENUSAUR_DOLL,
/*115*/ DECOR_CHARIZARD_DOLL,
/*116*/ DECOR_BLASTOISE_DOLL,
/*117*/ DECOR_WAILMER_DOLL,
/*118*/ DECOR_REGIROCK_DOLL,
/*119*/ DECOR_REGICE_DOLL,
/*120*/ DECOR_REGISTEEL_DOLL
};
// Exported type declarations
struct Decoration
{
/*0x00*/ u8 id;
/*0x01*/ u8 name[16];
/*0x11*/ u8 permission;
/*0x12*/ u8 shape;
/*0x13*/ u8 category;
/*0x14*/ u16 price;
/*0x18*/ const u8 *description;
/*0x1c*/ const u16 *tiles;
};
// Exported RAM declarations
// Exported ROM declarations
extern const struct Decoration gDecorations[];
#endif //GUARD_DECORATION_H

6
include/diploma.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef GUARD_DIPLOMA_H
#define GUARD_DIPLOMA_H
void CB2_ShowDiploma(void);
#endif // GUARD_DIPLOMA_H

View File

@ -31,7 +31,8 @@ enum
void InitEasyChatPhrases(void);
void easy_chat_input_maybe(void);
void CopyEasyChatWord(u8 *dest, u16 word);
bool32 sub_811F8D8(u16 word);
void InitializeEasyChatWordArray(u16 *words, u16 length);
void ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 length1, u16 length2);
bool32 sub_811F8D8(u16);
#endif // GUARD_EASYCHAT_H

View File

@ -8,4 +8,353 @@
extern const u8 gUnknown_082766A2[];
extern const u8 gUnknown_082766A6[];
extern const u8 gTVBravoTrainerText00[];
extern const u8 gTVBravoTrainerText01[];
extern const u8 gTVBravoTrainerText02[];
extern const u8 gTVBravoTrainerText03[];
extern const u8 gTVBravoTrainerText04[];
extern const u8 gTVBravoTrainerText05[];
extern const u8 gTVBravoTrainerText06[];
extern const u8 gTVBravoTrainerText07[];
extern const u8 gTVBravoTrainerText08[];
extern const u8 gTVBravoTrainerBattleTowerText00[];
extern const u8 gTVBravoTrainerBattleTowerText01[];
extern const u8 gTVBravoTrainerBattleTowerText02[];
extern const u8 gTVBravoTrainerBattleTowerText03[];
extern const u8 gTVBravoTrainerBattleTowerText04[];
extern const u8 gTVBravoTrainerBattleTowerText05[];
extern const u8 gTVBravoTrainerBattleTowerText06[];
extern const u8 gTVBravoTrainerBattleTowerText07[];
extern const u8 gTVBravoTrainerBattleTowerText08[];
extern const u8 gTVBravoTrainerBattleTowerText09[];
extern const u8 gTVBravoTrainerBattleTowerText10[];
extern const u8 gTVBravoTrainerBattleTowerText11[];
extern const u8 gTVBravoTrainerBattleTowerText12[];
extern const u8 gTVBravoTrainerBattleTowerText13[];
extern const u8 gTVBravoTrainerBattleTowerText14[];
extern const u8 gTVFanClubOpinionsText00[];
extern const u8 gTVFanClubOpinionsText01[];
extern const u8 gTVFanClubOpinionsText02[];
extern const u8 gTVFanClubOpinionsText03[];
extern const u8 gTVFanClubOpinionsText04[];
extern const u8 gTVFanClubText00[];
extern const u8 gTVFanClubText01[];
extern const u8 gTVFanClubText02[];
extern const u8 gTVFanClubText03[];
extern const u8 gTVFanClubText04[];
extern const u8 gTVFanClubText05[];
extern const u8 gTVFanClubText06[];
extern const u8 gTVFanClubText07[];
extern const u8 gTVRecentHappeningsText00[];
extern const u8 gTVRecentHappeningsText01[];
extern const u8 gTVRecentHappeningsText02[];
extern const u8 gTVRecentHappeningsText03[];
extern const u8 gTVRecentHappeningsText04[];
extern const u8 gTVRecentHappeningsText05[];
extern const u8 gTVMassOutbreakText00[];
extern const u8 gTV3CheersForPokeblocksText00[];
extern const u8 gTV3CheersForPokeblocksText01[];
extern const u8 gTV3CheersForPokeblocksText02[];
extern const u8 gTV3CheersForPokeblocksText03[];
extern const u8 gTV3CheersForPokeblocksText04[];
extern const u8 gTV3CheersForPokeblocksText05[];
extern const u8 gTVTrainerFanClubSpecialText00[];
extern const u8 gTVTrainerFanClubSpecialText01[];
extern const u8 gTVTrainerFanClubSpecialText02[];
extern const u8 gTVTrainerFanClubSpecialText03[];
extern const u8 gTVTrainerFanClubSpecialText04[];
extern const u8 gTVTrainerFanClubSpecialText05[];
extern const u8 gTVNameRaterText00[];
extern const u8 gTVNameRaterText01[];
extern const u8 gTVNameRaterText02[];
extern const u8 gTVNameRaterText03[];
extern const u8 gTVNameRaterText04[];
extern const u8 gTVNameRaterText05[];
extern const u8 gTVNameRaterText06[];
extern const u8 gTVNameRaterText07[];
extern const u8 gTVNameRaterText08[];
extern const u8 gTVNameRaterText09[];
extern const u8 gTVNameRaterText10[];
extern const u8 gTVNameRaterText11[];
extern const u8 gTVNameRaterText12[];
extern const u8 gTVNameRaterText13[];
extern const u8 gTVNameRaterText14[];
extern const u8 gTVNameRaterText15[];
extern const u8 gTVNameRaterText16[];
extern const u8 gTVNameRaterText17[];
extern const u8 gTVNameRaterText18[];
extern const u8 gTVPokemonAnglerText00[];
extern const u8 gTVPokemonAnglerText01[];
extern const u8 gTVPokemonTodayFailedText00[];
extern const u8 gTVPokemonTodayFailedText01[];
extern const u8 gTVPokemonTodayFailedText02[];
extern const u8 gTVPokemonTodayFailedText03[];
extern const u8 gTVPokemonTodayFailedText04[];
extern const u8 gTVPokemonTodayFailedText05[];
extern const u8 gTVPokemonTodayFailedText06[];
extern const u8 gTVPokemonTodaySuccessfulText00[];
extern const u8 gTVPokemonTodaySuccessfulText01[];
extern const u8 gTVPokemonTodaySuccessfulText02[];
extern const u8 gTVPokemonTodaySuccessfulText03[];
extern const u8 gTVPokemonTodaySuccessfulText04[];
extern const u8 gTVPokemonTodaySuccessfulText05[];
extern const u8 gTVPokemonTodaySuccessfulText06[];
extern const u8 gTVPokemonTodaySuccessfulText07[];
extern const u8 gTVPokemonTodaySuccessfulText08[];
extern const u8 gTVPokemonTodaySuccessfulText09[];
extern const u8 gTVPokemonTodaySuccessfulText10[];
extern const u8 gTVPokemonTodaySuccessfulText11[];
extern const u8 gTVTodaysSmartShopperText00[];
extern const u8 gTVTodaysSmartShopperText01[];
extern const u8 gTVTodaysSmartShopperText02[];
extern const u8 gTVTodaysSmartShopperText03[];
extern const u8 gTVTodaysSmartShopperText04[];
extern const u8 gTVTodaysSmartShopperText05[];
extern const u8 gTVTodaysSmartShopperText06[];
extern const u8 gTVTodaysSmartShopperText07[];
extern const u8 gTVTodaysSmartShopperText08[];
extern const u8 gTVTodaysSmartShopperText09[];
extern const u8 gTVTodaysSmartShopperText10[];
extern const u8 gTVTodaysSmartShopperText11[];
extern const u8 gTVTodaysSmartShopperText12[];
extern const u8 gTVWorldOfMastersText00[];
extern const u8 gTVWorldOfMastersText01[];
extern const u8 gTVWorldOfMastersText02[];
extern const u8 gTVTodaysRivalTrainerText00[];
extern const u8 gTVTodaysRivalTrainerText07[];
extern const u8 gTVTodaysRivalTrainerText08[];
extern const u8 gTVTodaysRivalTrainerText09[];
extern const u8 gTVTodaysRivalTrainerText10[];
extern const u8 gTVTodaysRivalTrainerText01[];
extern const u8 gTVTodaysRivalTrainerText02[];
extern const u8 gTVTodaysRivalTrainerText03[];
extern const u8 gTVTodaysRivalTrainerText04[];
extern const u8 gTVTodaysRivalTrainerText05[];
extern const u8 gTVTodaysRivalTrainerText06[];
extern const u8 gTVDewfordTrendWatcherNetworkText00[];
extern const u8 gTVDewfordTrendWatcherNetworkText01[];
extern const u8 gTVDewfordTrendWatcherNetworkText02[];
extern const u8 gTVDewfordTrendWatcherNetworkText03[];
extern const u8 gTVDewfordTrendWatcherNetworkText04[];
extern const u8 gTVDewfordTrendWatcherNetworkText05[];
extern const u8 gTVDewfordTrendWatcherNetworkText06[];
extern const u8 gTVHoennTreasureInvestigatorsText00[];
extern const u8 gTVHoennTreasureInvestigatorsText01[];
extern const u8 gTVHoennTreasureInvestigatorsText02[];
extern const u8 gTVFindThatGamerText00[];
extern const u8 gTVFindThatGamerText01[];
extern const u8 gTVFindThatGamerText02[];
extern const u8 gTVFindThatGamerText03[];
extern const u8 gTVBreakingNewsText00[];
extern const u8 gTVBreakingNewsText01[];
extern const u8 gTVBreakingNewsText02[];
extern const u8 gTVBreakingNewsText03[];
extern const u8 gTVBreakingNewsText04[];
extern const u8 gTVBreakingNewsText05[];
extern const u8 gTVBreakingNewsText06[];
extern const u8 gTVBreakingNewsText07[];
extern const u8 gTVBreakingNewsText12[];
extern const u8 gTVBreakingNewsText08[];
extern const u8 gTVBreakingNewsText09[];
extern const u8 gTVBreakingNewsText10[];
extern const u8 gTVBreakingNewsText11[];
extern const u8 gTVSecretBaseVisitText00[];
extern const u8 gTVSecretBaseVisitText01[];
extern const u8 gTVSecretBaseVisitText02[];
extern const u8 gTVSecretBaseVisitText03[];
extern const u8 gTVSecretBaseVisitText04[];
extern const u8 gTVSecretBaseVisitText05[];
extern const u8 gTVSecretBaseVisitText06[];
extern const u8 gTVSecretBaseVisitText07[];
extern const u8 gTVSecretBaseVisitText08[];
extern const u8 gTVSecretBaseVisitText09[];
extern const u8 gTVSecretBaseVisitText10[];
extern const u8 gTVSecretBaseVisitText11[];
extern const u8 gTVSecretBaseVisitText12[];
extern const u8 gTVSecretBaseVisitText13[];
extern const u8 gTVPokemonLotteryWinnerFlashReportText00[];
extern const u8 gTVThePokemonBattleSeminarText00[];
extern const u8 gTVThePokemonBattleSeminarText01[];
extern const u8 gTVThePokemonBattleSeminarText02[];
extern const u8 gTVThePokemonBattleSeminarText03[];
extern const u8 gTVThePokemonBattleSeminarText04[];
extern const u8 gTVThePokemonBattleSeminarText05[];
extern const u8 gTVThePokemonBattleSeminarText06[];
extern const u8 gTVTrainerFanClubText00[];
extern const u8 gTVTrainerFanClubText01[];
extern const u8 gTVTrainerFanClubText02[];
extern const u8 gTVTrainerFanClubText03[];
extern const u8 gTVTrainerFanClubText04[];
extern const u8 gTVTrainerFanClubText05[];
extern const u8 gTVTrainerFanClubText06[];
extern const u8 gTVTrainerFanClubText07[];
extern const u8 gTVTrainerFanClubText08[];
extern const u8 gTVTrainerFanClubText09[];
extern const u8 gTVTrainerFanClubText10[];
extern const u8 gTVTrainerFanClubText11[];
extern const u8 gTVCutiesText00[];
extern const u8 gTVCutiesText01[];
extern const u8 gTVCutiesText02[];
extern const u8 gTVCutiesText03[];
extern const u8 gTVCutiesText04[];
extern const u8 gTVCutiesText05[];
extern const u8 gTVCutiesText06[];
extern const u8 gTVCutiesText07[];
extern const u8 gTVCutiesText08[];
extern const u8 gTVCutiesText09[];
extern const u8 gTVCutiesText10[];
extern const u8 gTVCutiesText11[];
extern const u8 gTVCutiesText12[];
extern const u8 gTVCutiesText13[];
extern const u8 gTVCutiesText14[];
extern const u8 gTVCutiesText15[];
extern const u8 gTVPokemonNewsBattleFrontierText00[];
extern const u8 gTVPokemonNewsBattleFrontierText01[];
extern const u8 gTVPokemonNewsBattleFrontierText02[];
extern const u8 gTVPokemonNewsBattleFrontierText03[];
extern const u8 gTVPokemonNewsBattleFrontierText04[];
extern const u8 gTVPokemonNewsBattleFrontierText05[];
extern const u8 gTVPokemonNewsBattleFrontierText06[];
extern const u8 gTVPokemonNewsBattleFrontierText07[];
extern const u8 gTVPokemonNewsBattleFrontierText08[];
extern const u8 gTVPokemonNewsBattleFrontierText09[];
extern const u8 gTVPokemonNewsBattleFrontierText10[];
extern const u8 gTVPokemonNewsBattleFrontierText11[];
extern const u8 gTVPokemonNewsBattleFrontierText12[];
extern const u8 gTVPokemonNewsBattleFrontierText13[];
extern const u8 gTVPokemonNewsBattleFrontierText14[];
extern const u8 gTVPokemonNewsBattleFrontierText15[];
extern const u8 gTVPokemonNewsBattleFrontierText16[];
extern const u8 gTVPokemonNewsBattleFrontierText17[];
extern const u8 gTVPokemonNewsBattleFrontierText18[];
extern const u8 gTVWhatsNo1InHoennTodayText00[];
extern const u8 gTVWhatsNo1InHoennTodayText01[];
extern const u8 gTVWhatsNo1InHoennTodayText02[];
extern const u8 gTVWhatsNo1InHoennTodayText03[];
extern const u8 gTVWhatsNo1InHoennTodayText04[];
extern const u8 gTVWhatsNo1InHoennTodayText05[];
extern const u8 gTVWhatsNo1InHoennTodayText06[];
extern const u8 gTVWhatsNo1InHoennTodayText07[];
extern const u8 gTVWhatsNo1InHoennTodayText08[];
extern const u8 gTVSecretBaseSecretsText00[];
extern const u8 gTVSecretBaseSecretsText01[];
extern const u8 gTVSecretBaseSecretsText02[];
extern const u8 gTVSecretBaseSecretsText03[];
extern const u8 gTVSecretBaseSecretsText04[];
extern const u8 gTVSecretBaseSecretsText05[];
extern const u8 gTVSecretBaseSecretsText06[];
extern const u8 gTVSecretBaseSecretsText07[];
extern const u8 gTVSecretBaseSecretsText08[];
extern const u8 gTVSecretBaseSecretsText09[];
extern const u8 gTVSecretBaseSecretsText10[];
extern const u8 gTVSecretBaseSecretsText11[];
extern const u8 gTVSecretBaseSecretsText12[];
extern const u8 gTVSecretBaseSecretsText13[];
extern const u8 gTVSecretBaseSecretsText14[];
extern const u8 gTVSecretBaseSecretsText15[];
extern const u8 gTVSecretBaseSecretsText16[];
extern const u8 gTVSecretBaseSecretsText17[];
extern const u8 gTVSecretBaseSecretsText18[];
extern const u8 gTVSecretBaseSecretsText19[];
extern const u8 gTVSecretBaseSecretsText20[];
extern const u8 gTVSecretBaseSecretsText21[];
extern const u8 gTVSecretBaseSecretsText22[];
extern const u8 gTVSecretBaseSecretsText23[];
extern const u8 gTVSecretBaseSecretsText24[];
extern const u8 gTVSecretBaseSecretsText25[];
extern const u8 gTVSecretBaseSecretsText26[];
extern const u8 gTVSecretBaseSecretsText27[];
extern const u8 gTVSecretBaseSecretsText28[];
extern const u8 gTVSecretBaseSecretsText29[];
extern const u8 gTVSecretBaseSecretsText30[];
extern const u8 gTVSecretBaseSecretsText31[];
extern const u8 gTVSecretBaseSecretsText32[];
extern const u8 gTVSecretBaseSecretsText33[];
extern const u8 gTVSecretBaseSecretsText34[];
extern const u8 gTVSecretBaseSecretsText35[];
extern const u8 gTVSecretBaseSecretsText36[];
extern const u8 gTVSecretBaseSecretsText37[];
extern const u8 gTVSecretBaseSecretsText38[];
extern const u8 gTVSecretBaseSecretsText39[];
extern const u8 gTVSecretBaseSecretsText40[];
extern const u8 gTVSecretBaseSecretsText41[];
extern const u8 gTVSecretBaseSecretsText42[];
extern const u8 gTVSafariFanClubText00[];
extern const u8 gTVSafariFanClubText01[];
extern const u8 gTVSafariFanClubText02[];
extern const u8 gTVSafariFanClubText03[];
extern const u8 gTVSafariFanClubText04[];
extern const u8 gTVSafariFanClubText05[];
extern const u8 gTVSafariFanClubText06[];
extern const u8 gTVSafariFanClubText07[];
extern const u8 gTVSafariFanClubText08[];
extern const u8 gTVSafariFanClubText09[];
extern const u8 gTVSafariFanClubText10[];
extern const u8 gTVContestLiveUpdatesText00[];
extern const u8 gTVContestLiveUpdatesText01[];
extern const u8 gTVContestLiveUpdatesText02[];
extern const u8 gTVContestLiveUpdatesText03[];
extern const u8 gTVContestLiveUpdatesText04[];
extern const u8 gTVContestLiveUpdatesText05[];
extern const u8 gTVContestLiveUpdatesText06[];
extern const u8 gTVContestLiveUpdatesText07[];
extern const u8 gTVContestLiveUpdatesText08[];
extern const u8 gTVContestLiveUpdatesText09[];
extern const u8 gTVContestLiveUpdatesText10[];
extern const u8 gTVContestLiveUpdatesText11[];
extern const u8 gTVContestLiveUpdatesText12[];
extern const u8 gTVContestLiveUpdatesText13[];
extern const u8 gTVContestLiveUpdatesText14[];
extern const u8 gTVContestLiveUpdatesText15[];
extern const u8 gTVContestLiveUpdatesText16[];
extern const u8 gTVContestLiveUpdatesText17[];
extern const u8 gTVContestLiveUpdatesText18[];
extern const u8 gTVContestLiveUpdatesText19[];
extern const u8 gTVContestLiveUpdatesText20[];
extern const u8 gTVContestLiveUpdatesText21[];
extern const u8 gTVContestLiveUpdatesText22[];
extern const u8 gTVContestLiveUpdatesText23[];
extern const u8 gTVContestLiveUpdatesText24[];
extern const u8 gTVContestLiveUpdatesText25[];
extern const u8 gTVContestLiveUpdatesText26[];
extern const u8 gTVContestLiveUpdatesText27[];
extern const u8 gTVContestLiveUpdatesText28[];
extern const u8 gTVContestLiveUpdatesText29[];
extern const u8 gTVContestLiveUpdatesText30[];
extern const u8 gTVContestLiveUpdatesText31[];
extern const u8 gTVContestLiveUpdatesText32[];
extern const u8 gTVPokemonBattleUpdateText00[];
extern const u8 gTVPokemonBattleUpdateText01[];
extern const u8 gTVPokemonBattleUpdateText02[];
extern const u8 gTVPokemonBattleUpdateText03[];
extern const u8 gTVPokemonBattleUpdateText04[];
extern const u8 gTVPokemonBattleUpdateText05[];
extern const u8 gTVPokemonBattleUpdateText06[];
extern const u8 gTVPokemonBattleUpdateText07[];
extern const u8 gTVInSearchOfTrainersText00[];
extern const u8 gTVInSearchOfTrainersText01[];
extern const u8 gTVInSearchOfTrainersText02[];
extern const u8 gTVInSearchOfTrainersText03[];
extern const u8 gTVInSearchOfTrainersText04[];
extern const u8 gTVInSearchOfTrainersText05[];
extern const u8 gTVInSearchOfTrainersText06[];
extern const u8 gTVInSearchOfTrainersText07[];
extern const u8 gTVInSearchOfTrainersText08[];
extern const u8 gTVPokemonContestLiveUpdates2Text00[];
extern const u8 gTVPokemonContestLiveUpdates2Text01[];
extern const u8 gTVPokemonContestLiveUpdates2Text02[];
extern const u8 gTVPokemonContestLiveUpdates2Text03[];
extern const u8 gPokeNewsTextSlateport_Upcoming[];
extern const u8 gPokeNewsTextSlateport_Ongoing[];
extern const u8 gPokeNewsTextSlateport_Ending[];
extern const u8 gPokeNewsTextGameCorner_Upcoming[];
extern const u8 gPokeNewsTextGameCorner_Ongoing[];
extern const u8 gPokeNewsTextGameCorner_Ending[];
extern const u8 gPokeNewsTextLilycove_Upcoming[];
extern const u8 gPokeNewsTextLilycove_Ongoing[];
extern const u8 gPokeNewsTextLilycove_Ending[];
extern const u8 gPokeNewsTextBlendMaster_Upcoming[];
extern const u8 gPokeNewsTextBlendMaster_Ongoing[];
extern const u8 gPokeNewsTextBlendMaster_Ending[];
#endif //GUARD_EVENT_SCRIPTS_H

View File

@ -22,4 +22,6 @@ extern u16 gUnknown_03005DE8;
// Exported ROM declarations
void DrawWholeMapView(void);
#endif //GUARD_FIELD_CAMERA_H

View File

@ -0,0 +1,12 @@
#ifndef GUARD_field_message_box_H
#define GUARD_field_message_box_H
// Exported type declarations
// Exported RAM declarations
// Exported ROM declarations
void ShowFieldMessage(const u8 *);
#endif //GUARD_field_message_box_H

View File

@ -8,9 +8,14 @@
// Exported type declarations
// Exported RAM declarations
extern struct MapCoords {
int width;
int height;
} gUnknown_03005DC0;
// Exported ROM declarations
u8 MapGridGetMetatileBehaviorAt(s16, s16);
u32 MapGridGetMetatileBehaviorAt(int, int);
void MapGridSetMetatileIdAt(int, int, u16);
void GetCameraCoords(u16*, u16*);
bool8 MapGridIsImpassableAt(s16, s16);
s32 GetMapBorderIdAt(s16, s16);

View File

@ -3,7 +3,7 @@
#define TRAINER_FLAG_START 0x500
#define TRAINERS_FLAG_NO 0x356
#define CODE_FLAGS (TRAINER_FLAG_START + TRAINERS_FLAG_NO + 0xA)
#define CODE_FLAGS (TRAINER_FLAG_START + TRAINERS_FLAG_NO + 0xA) // 0x860
// SYSTEM FLAGS
@ -84,6 +84,20 @@
#define SYS_CTRL_OBJ_DELETE CODE_FLAGS + 0x61
#define SYS_RESET_RTC_ENABLE CODE_FLAGS + 0x62
#define SYS_TOWER_SILVER CODE_FLAGS + 0x64
#define SYS_TOWER_GOLD CODE_FLAGS + 0x65
#define SYS_DOME_SILVER CODE_FLAGS + 0x66
#define SYS_DOME_GOLD CODE_FLAGS + 0x67
#define SYS_PALACE_SILVER CODE_FLAGS + 0x68
#define SYS_PALACE_GOLD CODE_FLAGS + 0x69
#define SYS_ARENA_SILVER CODE_FLAGS + 0x6A
#define SYS_ARENA_GOLD CODE_FLAGS + 0x6B
#define SYS_FACTORY_SILVER CODE_FLAGS + 0x6C
#define SYS_FACTORY_GOLD CODE_FLAGS + 0x6D
#define SYS_PIKE_SILVER CODE_FLAGS + 0x6E
#define SYS_PIKE_GOLD CODE_FLAGS + 0x6F
#define SYS_PYRAMID_SILVER CODE_FLAGS + 0x70
#define SYS_PYRAMID_GOLD CODE_FLAGS + 0x71
#define SYS_FRONTIER_PASS CODE_FLAGS + 0x72
#define SYS_STORAGE_UNKNOWN_FLAG CODE_FLAGS + 0x77

View File

@ -56,4 +56,7 @@
#define NUM_GAME_STATS 64
void IncrementGameStat(u8);
u32 GetGameStat(u8);
#endif // GUARD_GAME_STAT_H

View File

@ -197,7 +197,13 @@ struct SaveBlock2
// All below could be a one giant struct
/*0x64C*/ u8 field_64C[1629];
/*0x64C*/ u8 field_64C[0x588];
/*0xBD4*/ u16 field_BD4;
/*0xBD6*/ u16 field_BD6;
/*0xBD8*/ u8 field_BD8[11];
/*0xBE3*/ u8 filler_BE3[8];
/*0xBEB*/ u8 field_BEB;
/*0xBE3*/ u8 filler_BEC[189];
/*0xCA9*/ u8 frontierChosenLvl : 2; // 0x1, 0x2 -> 0x3
/*0xCA9*/ u8 field_CA9_a : 1; // 0x4
/*0xCA9*/ u8 field_CA9_b : 1; // 0x8
@ -205,7 +211,10 @@ struct SaveBlock2
/*0xCA9*/ u8 field_CA9_d : 1; // 0x20
/*0xCA9*/ u8 field_CA9_e : 1; // 0x40
/*0xCA9*/ u8 field_CA9_f : 1; // 0x80
/*0xCAA*/ u8 field_CAA[368];
/*0xCAA*/ u16 field_CAA[0x2e];
/*0xD06*/ u8 field_D06;
/*0xD07*/ u8 field_D07;
/*0xd08*/ u8 filler_D08[0x112];
/*0xE1A*/ u16 battlePyramidFloor; // possibly?
/*0xE1C*/ u8 field_E1C[16];
/*0xE2C*/ struct PyramidBag pyramidBag;
@ -225,30 +234,31 @@ extern struct SaveBlock2 *gSaveBlock2Ptr;
struct SecretBaseRecord
{
u8 sbr_field_0;
u8 sbr_field_1_0:4;
u8 gender:1;
u8 sbr_field_1_5:1;
u8 sbr_field_1_6:2;
u8 trainerName[7];
u8 trainerId[4]; // byte 0 is used for determining trainer class
u8 language;
u16 sbr_field_e;
u8 sbr_field_10;
u8 sbr_field_11;
u8 decorations[16];
u8 decorationPos[16];
u32 partyPersonality[6];
u16 partyMoves[6 * 4];
u16 partySpecies[6];
u16 partyHeldItems[6];
u8 partyLevels[6];
u8 partyEVs[6];
/*ID?*/ /*0x1A9C*/ u8 sbr_field_0;
/*0x1A9D*/ u8 sbr_field_1_0:4;
/*0x1A9D*/ u8 gender:1;
/*0x1A9D*/ u8 sbr_field_1_5:1;
/*0x1A9D*/ u8 sbr_field_1_6:2;
/*0x1A9E*/ u8 trainerName[7]; // 0xFF bytes?
/*0x1AA5*/ u8 trainerId[4]; // byte 0 is used for determining trainer class
/*0x1AA9*/ u8 language;
/*0x1AAA*/ u16 sbr_field_e;
/*0x1AAC*/ u8 sbr_field_10;
/*0x1AAD*/ u8 sbr_field_11;
/*0x1AAE*/ u8 decorations[16];
/*0x1ABE*/ u8 decorationPos[16];
/*0x1ACE*/ u32 partyPersonality[6];
/*0x1AE6*/ u16 partyMoves[6 * 4];
/*0x1B16*/ u16 partySpecies[6];
/*0x1B22*/ u16 partyHeldItems[6];
/*0x1B2E*/ u8 partyLevels[6];
/*0x1B34*/ u8 partyEVs[6];
};
#include "game_stat.h"
#include "global.fieldmap.h"
#include "global.berry.h"
#include "global.tv.h"
#include "pokemon.h"
struct WarpData
@ -317,218 +327,6 @@ struct EasyChatPair
u16 words[2];
}; /*size = 0x8*/
struct TVShowCommon
{
/*0x00*/ u8 var00;
/*0x01*/ u8 var01;
/*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 var00;
/*0x01*/ u8 var01;
/*0x02*/ u16 species;
/*0x04*/ u16 pad04[6];
/*0x10*/ u8 playerName[8];
/*0x18*/ u8 language;
};
struct TVShowRecentHappenings
{
/*0x00*/ u8 var00;
/*0x01*/ u8 var01;
/*0x02*/ u16 var02;
/*0x04*/ u16 var04[6];
/*0x10*/ u8 playerName[8];
/*0x18*/ u8 language;
/*0x19*/ u8 pad19[10];
};
struct TVShowFanclubOpinions
{
/*0x00*/ u8 var00;
/*0x01*/ u8 var01;
/*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 var00;
/*0x01*/ u8 var01;
/*0x02*/ u8 pad02[4];
/*0x06*/ u16 var06;
};
struct TVShowNameRaterShow
{
/*0x00*/ u8 var00;
/*0x01*/ u8 var01;
/*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 var00;
/*0x01*/ u8 var01;
/*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 var00;
/*0x01*/ u8 var01;
/*0x02*/ u8 trainerName[8];
/*0x0A*/ u16 species;
/*0x0C*/ u8 pokemonName[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 var00;
/*0x01*/ u8 var01;
/*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 var00;
/*0x01*/ u8 var01;
/*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 var00;
/*0x01*/ u8 var01;
/*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 var00;
/*0x01*/ u8 var01;
/*0x02*/ u8 var02;
/*0x03*/ u8 var03;
/*0x04*/ u16 var04;
/*0x06*/ u8 language;
u8 pad07[12];
/*0x13*/ u8 playerName[8];
};
struct TVShowWorldOfMasters
{
/*0x00*/ u8 var00;
/*0x01*/ u8 var01;
/*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 var00;
/*0x01*/ u8 var01;
/*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 var16;
/*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];
@ -576,35 +374,6 @@ typedef union OldMan
u8 filler[0x40];
} OldMan;
struct UnknownSaveStruct2ABC
{
u8 val0;
u8 val1;
u16 val2;
};
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 RecordMixing_UnknownStructSub
{
u32 unk0;
@ -781,22 +550,22 @@ struct SaveBlock1
/*0x????*/ u8 decorCushion[10];
/*0x27CA*/ u8 padding_27CA[2];
/*0x27CC*/ TVShow tvShows[25];
/*0x2B50*/ struct UnknownSaveStruct2ABC pokeNews[16];
/*0x2B50*/ PokeNews pokeNews[16];
/*0x2B90*/ u16 outbreakPokemonSpecies;
/*0x????*/ u8 outbreakLocationMapNum;
/*0x????*/ u8 outbreakLocationMapGroup;
/*0x????*/ u8 outbreakPokemonLevel;
/*0x????*/ u8 outbreakUnk1;
/*0x????*/ u16 outbreakUnk2;
/*0x????*/ u16 outbreakPokemonMoves[4];
/*0x????*/ u8 outbreakUnk4;
/*0x????*/ u8 outbreakPokemonProbability;
/*0x????*/ u16 outbreakUnk5;
/*0x2B92*/ u8 outbreakLocationMapNum;
/*0x2B93*/ u8 outbreakLocationMapGroup;
/*0x2B94*/ u8 outbreakPokemonLevel;
/*0x2B95*/ u8 outbreakUnk1;
/*0x2B96*/ u16 outbreakUnk2;
/*0x2B98*/ u16 outbreakPokemonMoves[4];
/*0x2BA0*/ u8 outbreakUnk4;
/*0x2BA1*/ u8 outbreakPokemonProbability;
/*0x2BA2*/ u16 outbreakDaysLeft;
/*0x2BA4*/ struct GabbyAndTyData gabbyAndTyData;
/*0x????*/ u16 unk2B1C[6];
/*0x????*/ u16 unk2B28[6];
/*0x????*/ u16 unk2B34[6];
/*0x????*/ u16 unk2B3A[3];
/*0x2BB0*/ u16 unk2BB0[6];
/*0x2BBC*/ u16 unk2BBC[6];
/*0x2BC8*/ u16 unk2BC8[6];
/*0x2BD4*/ u16 unk2BD4[3];
/*0x2BE0*/ struct MailStruct mail[16];
/*0x2E20*/ u8 additionalPhrases[5]; // bitfield for 33 additional phrases in easy chat system
/*0x2E25*/ u8 unk2E25[3]; // possibly padding?
@ -806,7 +575,8 @@ struct SaveBlock1
/*0x2e90*/ struct ContestWinner contestWinners[13]; // 0 - 5 used in contest hall, 6 - 7 unused?, 8 - 12 museum
/*0x3030*/ struct DaycareData daycare;
/*0x3150*/ struct LinkBattleRecord linkBattleRecords[5];
/*0x31A0*/ u8 filler_31A0[8];
/*0x31A0*/ u8 unk_31A0;
/*0x31A1*/ u8 filler_31A1[7];
/*0x31A8*/ u8 giftRibbons[52];
/*0x31DC*/ struct Roamer roamer;
/*0x31F8*/ struct EnigmaBerry enigmaBerry;

535
include/global.tv.h Normal file
View File

@ -0,0 +1,535 @@
#ifndef GUARD_GLOBAL_TV_H
#define GUARD_GLOBAL_TV_H
enum
{
TVSHOW_OFF_AIR,
TVSHOW_FAN_CLUB_LETTER = 1,
TVSHOW_RECENT_HAPPENINGS,
TVSHOW_PKMN_FAN_CLUB_OPINIONS,
TVSHOW_UNKN_SHOWTYPE_04,
TVSHOW_NAME_RATER_SHOW,
TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE,
TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE,
TVSHOW_CONTEST_LIVE_UPDATES,
TVSHOW_3_CHEERS_FOR_POKEBLOCKS,
TVSHOW_BATTLE_UPDATE,
TVSHOW_FAN_CLUB_SPECIAL,
TVSHOW_CONTEST_LIVE_UPDATES_2,
TVSHOW_POKEMON_TODAY_CAUGHT = 21,
TVSHOW_SMART_SHOPPER,
TVSHOW_POKEMON_TODAY_FAILED,
TVSHOW_FISHING_ADVICE,
TVSHOW_WORLD_OF_MASTERS,
TVSHOW_TODAYS_RIVAL_TRAINER,
TVSHOW_TREND_WATCHER,
TVSHOW_TREASURE_INVESTIGATORS,
TVSHOW_FIND_THAT_GAMER,
TVSHOW_BREAKING_NEWS,
TVSHOW_SECRET_BASE_VISIT,
TVSHOW_LOTTO_WINNER,
TVSHOW_BATTLE_SEMINAR,
TVSHOW_TRAINER_FAN_CLUB,
TVSHOW_CUTIES,
TVSHOW_FRONTIER,
TVSHOW_NUMBER_ONE,
TVSHOW_SECRET_BASE_SECRETS,
TVSHOW_SAFARI_FAN_CLUB,
TVSHOW_MASS_OUTBREAK = 41,
};
typedef union // size = 0x24
{
// Common
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 pad02[26];
/*0x1C*/ u8 srcTrainerId3Lo;
/*0x1D*/ u8 srcTrainerId3Hi;
/*0x1E*/ u8 srcTrainerId2Lo;
/*0x1F*/ u8 srcTrainerId2Hi;
/*0x20*/ u8 srcTrainerIdLo;
/*0x21*/ u8 srcTrainerIdHi;
/*0x22*/ u8 trainerIdLo;
/*0x23*/ u8 trainerIdHi;
} common;
// Local shows
// TVSHOW_FAN_CLUB_LETTER
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 species;
/*0x04*/ u16 words[6];
/*0x10*/ u8 playerName[8];
/*0x18*/ u8 language;
} fanclubLetter;
// TVSHOW_RECENT_HAPPENINGS
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 var02;
/*0x04*/ u16 words[6];
/*0x10*/ u8 playerName[8];
/*0x18*/ u8 language;
} recentHappenings;
// TVSHOW_PKMN_FAN_CLUB_OPINIONS
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 species;
/*0x04*/ u8 friendshipHighNybble:4;
/*0x04*/ u8 questionAsked:4;
/*0x05*/ u8 playerName[8];
/*0x0D*/ u8 language;
/*0x0E*/ u8 pokemonNameLanguage;
/*0x0F*/ u8 filler_0F[1];
/*0x10*/ u8 nickname[8];
/*0x18*/ u8 filler_18[4];
/*0x1C*/ u16 words[4];
} fanclubOpinions;
// TVSHOW_UNKN_SHOWTYPE_04 (dummied out)
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 pad02[4];
/*0x06*/ u16 var06;
/*0x08*/ u8 pad_08[3];
/*0x0b*/ u8 string_0b[12];
/*0x17*/ u8 language;
} unkShow04;
// TVSHOW_NAME_RATER_SHOW
struct {
/*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 randomSpecies;
/*0x1E*/ u8 language;
/*0x1F*/ u8 pokemonNameLanguage;
} nameRaterShow;
// TVSHOW_BRAVO_TRAINER_POKEMON_PROFILE (contest)
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 species;
/*0x04*/ u16 words[2];
/*0x08*/ u8 pokemonNickname[11];
/*0x13*/ u8 contestCategory:3;
/*0x13*/ u8 contestRank:2;
/*0x13*/ u8 contestResult:2;
/*0x14*/ u16 move;
/*0x16*/ u8 playerName[8];
/*0x1E*/ u8 language;
/*0x1F*/ u8 pokemonNameLanguage;
} bravoTrainer;
// TVSHOW_BRAVO_TRAINER_BATTLE_TOWER_PROFILE
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 trainerName[8];
/*0x0A*/ u16 species;
/*0x0C*/ u8 pokemonName[8];
/*0x14*/ u16 defeatedSpecies;
/*0x16*/ u16 numFights;
/*0x18*/ u16 words[1];
/*0x1A*/ u8 btLevel;
/*0x1B*/ u8 interviewResponse;
/*0x1C*/ bool8 wonTheChallenge;
/*0x1D*/ u8 language;
/*0x1E*/ u8 pokemonNameLanguage;
} bravoTrainerTower;
// TVSHOW_CONTEST_LIVE_UPDATES
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 winningSpecies;
/*0x04*/ u8 winningTrainerName[8];
/*0x0C*/ u8 appealFlags2;
/*0x0D*/ u8 round1Rank;
/*0x0e*/ u8 round2Rank;
/*0x0f*/ u8 appealFlags1;
/*0x10*/ u16 move;
/*0x12*/ u16 species;
/*0x14*/ u8 playerName[8];
/*0x1C*/ u8 category;
/*0x1D*/ u8 language;
/*0x1E*/ u8 winningTrainerLanguage;
} contestLiveUpdates;
// TVSHOW_3_CHEERS_FOR_POKEBLOCKS
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 sheen;
/*0x03*/ u8 flavor:3;
/*0x03*/ u8 unk_03_3:2;
/*0x04*/ u8 worstBlenderName[8];
/*0x0C*/ u8 playerName[8];
/*0x14*/ u8 language;
/*0x15*/ u8 worstBlenderLanguage;
} threeCheers;
// TVSHOW_BATTLE_UPDATE
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 species;
/*0x04*/ u8 playerName[8];
/*0x0C*/ u8 linkOpponentName[8];
/*0x14*/ u16 move;
/*0x16*/ u16 species2;
/*0x18*/ u8 battleType;
/*0x19*/ u8 language;
/*0x1A*/ u8 linkOpponentLanguage;
} battleUpdate;
// TVSHOW_FAN_CLUB_SPECIAL
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 playerName[8];
/*0x0a*/ u8 idLo;
/*0x0b*/ u8 idHi;
/*0x0c*/ u8 idolName[8];
/*0x14*/ u16 words[1];
/*0x16*/ u8 score;
/*0x17*/ u8 language;
/*0x18*/ u8 idolNameLanguage;
} fanClubSpecial;
// TVSHOW_CONTEST_LIVE_UPDATES_2
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 playerName[8];
/*0x0a*/ u8 contestCategory;
/*0x0b*/ u8 nickname[11];
/*0x16*/ u8 pokeblockState;
/*0x17*/ u8 language;
/*0x18*/ u8 pokemonNameLanguage;
} contestLiveUpdates2;
// Record Mixing Shows
// TVSHOW_POKEMON_TODAY_CAUGHT
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 language;
/*0x03*/ u8 language2;
/*0x04*/ u8 nickname[11];
/*0x0F*/ u8 ball;
/*0x10*/ u16 species;
/*0x12*/ u8 nBallsUsed;
/*0x13*/ u8 playerName[8];
} pokemonToday;
// TVSHOW_SMART_SHOPPER
struct {
/*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];
} smartshopperShow;
// TVSHOW_POKEMON_TODAY_FAILED
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 language;
/*0x03*/ u8 pad03[9];
/*0x0c*/ u16 species;
/*0x0e*/ u16 species2;
/*0x10*/ u8 nBallsUsed;
/*0x11*/ u8 outcome;
/*0x12*/ u8 location;
/*0x13*/ u8 playerName[8];
} pokemonTodayFailed;
// TVSHOW_FISHING_ADVICE
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 nBites;
/*0x03*/ u8 nFails;
/*0x04*/ u16 species;
/*0x06*/ u8 language;
/*0x07*/ u8 pad07[12];
/*0x13*/ u8 playerName[8];
} pokemonAngler;
// TVSHOW_WORLD_OF_MASTERS
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 numPokeCaught;
/*0x04*/ u16 caughtPoke;
/*0x06*/ u16 steps;
/*0x08*/ u16 species;
/*0x0a*/ u8 location;
/*0x0b*/ u8 language;
/*0x0c*/ u8 pad0c[7];
/*0x13*/ u8 playerName[8];
} worldOfMasters;
// TVSHOW_TODAYS_RIVAL_TRAINER
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 dexCount;
/*0x04*/ u8 badgeCount;
/*0x05*/ u8 nSilverSymbols;
/*0x06*/ u8 nGoldSymbols;
/*0x07*/ u8 location;
/*0x08*/ u16 battlePoints;
/*0x0a*/ u16 mapDataId;
/*0x0c*/ u8 language;
/*0x0d*/ u8 filler_0d[6];
/*0x13*/ u8 playerName[8];
} rivalTrainer;
// TVSHOW_TREND_WATCHER
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 filler_02[2];
/*0x04*/ u16 words[2];
/*0x08*/ u8 gender;
/*0x09*/ u8 language;
/*0x0a*/ u8 filler_0a[9];
/*0x13*/ u8 playerName[8];
} trendWatcher;
// TVSHOW_TREASURE_INVESTIGATORS
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 item;
/*0x04*/ u8 location;
/*0x05*/ u8 language;
/*0x06*/ u16 mapDataId;
/*0x08*/ u8 filler_08[11];
/*0x13*/ u8 playerName[8];
} treasureInvestigators;
// TVSHOW_FIND_THAT_GAMER
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 won;
/*0x03*/ u8 whichGame;
/*0x04*/ u16 nCoins;
/*0x06*/ u8 filler_06[2];
/*0x08*/ u8 language;
/*0x09*/ u8 filler_09[10];
/*0x13*/ u8 playerName[8];
} findThatGamer;
// TVSHOW_BREAKING_NEWS
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 lastOpponentSpecies;
/*0x04*/ u8 location;
/*0x05*/ u8 outcome;
/*0x06*/ u16 caughtMonBall;
/*0x08*/ u16 balls;
/*0x0a*/ u16 poke1Species;
/*0x0c*/ u16 lastUsedMove;
/*0x0e*/ u8 language;
/*0x0f*/ u8 filler_0f[4];
/*0x13*/ u8 playerName[8];
} breakingNews;
// TVSHOW_SECRET_BASE_VISIT
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 avgLevel;
/*0x03*/ u8 nDecorations;
/*0x04*/ u8 decorations[4];
/*0x08*/ u16 species;
/*0x0a*/ u16 move;
/*0x0c*/ u8 language;
/*0x0d*/ u8 filler_0d[6];
/*0x13*/ u8 playerName[8];
} secretBaseVisit;
// TVSHOW_LOTTO_WINNER
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 item;
/*0x04*/ u8 whichPrize;
/*0x05*/ u8 language;
/*0x06*/ u8 filler_06[13];
/*0x13*/ u8 playerName[8];
} lottoWinner;
// TVSHOW_BATTLE_SEMINAR
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 move;
/*0x04*/ u16 foeSpecies;
/*0x06*/ u16 species;
/*0x08*/ u16 otherMoves[3];
/*0x0e*/ u16 betterMove;
/*0x10*/ u8 nOtherMoves;
/*0x11*/ u8 language;
/*0x12*/ u8 filler_12[1];
/*0x13*/ u8 playerName[8];
} battleSeminar;
// TVSHOW_TRAINER_FAN_CLUB
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 filler_02[2];
/*0x04*/ u16 words[2];
/*0x08*/ u8 language;
/*0x09*/ u8 filler_09[10];
/*0x13*/ u8 playerName[8];
} trainerFanClub;
// TVSHOW_CUTIES
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 nRibbons;
/*0x03*/ u8 selectedRibbon;
/*0x04*/ u8 nickname[11];
/*0x0f*/ u8 language;
/*0x10*/ u8 pokemonNameLanguage;
/*0x11*/ u8 filler_12[2];
/*0x13*/ u8 playerName[8];
} cuties;
// TVSHOW_FRONTIER
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 winStreak;
/*0x04*/ u16 species1;
/*0x06*/ u16 species2;
/*0x08*/ u16 species3;
/*0x0a*/ u16 species4;
/*0x0c*/ u8 language;
/*0x0d*/ u8 facility;
/*0x0e*/ u8 filler_0e[5];
/*0x13*/ u8 playerName[8];
} frontier;
// TVSHOW_NUMBER_ONE
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 count;
/*0x04*/ u8 actionIdx;
/*0x05*/ u8 language;
/*0x06*/ u8 filler_06[13];
/*0x13*/ u8 playerName[8];
} numberOne;
// TVSHOW_SECRET_BASE_SECRETS
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u16 stepsInBase;
/*0x04*/ u8 baseOwnersName[8];
/*0x0c*/ u32 flags;
/*0x10*/ u16 item;
/*0x12*/ u8 savedState;
/*0x13*/ u8 playerName[8];
/*0x1b*/ u8 language;
/*0x1c*/ u8 baseOwnersNameLanguage;
} secretBaseSecrets;
// TVSHOW_SAFARI_FAN_CLUB
struct {
/*0x00*/ u8 kind;
/*0x01*/ bool8 active;
/*0x02*/ u8 nMonsCaught;
/*0x03*/ u8 nPkblkUsed;
/*0x04*/ u8 language;
/*0x05*/ u8 filler_05[14];
/*0x13*/ u8 playerName[8];
} safariFanClub;
// Mass Outbreak
// TVSHOW_MASS_OUTBREAK
struct {
/*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;
} massOutbreak;
} TVShow;
enum {
POKENEWS_NONE,
POKENEWS_SLATEPORT,
POKENEWS_GAME_CORNER,
POKENEWS_LILYCOVE,
POKENEWS_BLENDMASTER
};
typedef struct // 2b50
{
u8 kind;
u8 state;
u16 days;
} PokeNews;
struct GabbyAndTyData
{
/*2ba4*/ u16 mon1;
/*2ba6*/ u16 mon2;
/*2ba8*/ u16 lastMove;
/*2baa*/ u16 quote[1];
/*2bac*/ u8 mapnum;
/*2bad*/ u8 battleNum;
/*2bae*/ u8 battleTookMoreThanOneTurn:1;
/*2bae*/ u8 playerLostAMon:1;
/*2bae*/ u8 playerUsedAnItem:1;
/*2bae*/ u8 playerThrewABall:1;
/*2bae*/ u8 onAir:1;
/*2bae*/ u8 valA_5:3;
/*2baf*/ u8 battleTookMoreThanOneTurn2:1;
/*2baf*/ u8 playerLostAMon2:1;
/*2baf*/ u8 playerUsedAnItem2:1;
/*2baf*/ u8 playerThrewABall2:1;
/*2baf*/ u8 valB_4:4;
};
#endif //GUARD_GLOBAL_TV_H

View File

@ -6,6 +6,9 @@
// Exported RAM declarations
// Exported ROM declarations
void sub_81DB52C(const u8 *src);
void TVShowConvertInternationalString(void *dest, const void *src, u8 language);
u32 sub_81DB604(const u8 *);
#endif //GUARD_INTERNATIONAL_STRING_UTIL_H

View File

@ -58,5 +58,6 @@ ItemUseFunc ItemId_GetFieldFunc(u16 itemId);
u8 ItemId_GetBattleUsage(u16 itemId);
ItemUseFunc ItemId_GetBattleFunc(u16 itemId);
u8 ItemId_GetSecondaryId(u16 itemId);
u16 itemid_get_market_price(u16 itemId);
#endif // ITEM_H

View File

@ -177,12 +177,12 @@ u32 LinkMain1(u8 *, u16 *, u16[CMD_LENGTH][MAX_LINK_PLAYERS]);
void LinkVSync(void);
void Timer3Intr(void);
void SerialCB(void);
u8 GetLinkPlayerCount(void);
void sub_800E0E8(void);
bool8 sub_800A520(void);
bool8 sub_8010500(void);
void sub_800DFB4(u8, u8);
void sub_800ADF8(void);
u8 sub_8009FCC(void);
#endif // GUARD_LINK_H

View File

@ -359,6 +359,7 @@ enum
MOVE_DOOM_DESIRE,
MOVE_PSYCHO_BOOST,
};
extern const u8 gMoveNames[][13];
#define LAST_MOVE_INDEX MOVE_PSYCHO_BOOST

View File

@ -16,6 +16,8 @@ enum
FLAG_SET_CAUGHT
};
u8 GetSetPokedexFlag(u16 nationalNum, u8 caseId);
s8 GetSetPokedexFlag(u16 nationalNum, u8 caseId);
u16 pokedex_count(u8);
u16 sub_80C0844(u8);
#endif // GUARD_POKEDEX_H

View File

@ -642,6 +642,7 @@ void UpdatePartyPokerusTime(u16 days);
void PartySpreadPokerus(struct Pokemon *party);
s8 GetMonFlavourRelation(struct Pokemon *mon, u8 a2);
s8 GetFlavourRelationByPersonality(u32 personality, u8 a2);
u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit);
#include "sprite.h"

View File

@ -3,6 +3,60 @@
#include "pokemon.h"
// TODO once pokemon item effects is decompiled
/*
struct PokemonItemEffect
{
//field 0
u8 xAtk : 4; // x1, x2, x4, x8 = xF
u8 field_0_x10 : 1; // x10
u8 critRatioUp : 1; // x20
u8 field_0_x40 : 1; // x40
u8 cureInfatuation : 1; // x80
/*field 1
u8 xSpeed : 4; // x1, x2, x4, x8 = xF
u8 xDefense : 4; // x10, x20, x40, xF0
/*field 2
u8 xSpAtk : 4; // x1, x2, x4, x8 = xF
u8 xAccuracy : 4; // x10, x20, x40, xF0
/*field 3
u8 cureConfusion : 1; // x1
u8 cureParalysis : 1; // x2
u8 cureFreeze : 1; // x4
u8 cureBurn : 1; // x8
u8 curePoison : 1; // x10
u8 cureSleep : 1; // x20
u8 field_3_x40 : 1; // x40
u8 cantLowerStats : 1; // x80
/*field 4
u8 hpEv : 1; // x1
u8 attackEv : 1; // x2
u8 healHp : 1; // x4
u8 field_4_x8 : 1; // x8
u8 field_4_x10 : 1; // x10
u8 ppUp : 1; // x20
u8 levelUp : 1; // x40
u8 evolutionStone : 1; // x80
/*field 5
u8 defEv: 1; // x1
u8 speedEv : 1; // x2
u8 spDefEv : 1; // x4
u8 spAtkEv : 1; // x8
u8 ppMax : 1; // x10
u8 field_5_x20 : 1; // x20
u8 field_5_x40 : 1; // x40
u8 field_5_x80 : 1; // x80
/*field 6
u8 value;
};
*/
bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 itemId, u8 partyId, u8 monMoveIndex, u8 a5);
#endif // GUARD_POKEMON_ITEM_EFFECTS

View File

@ -2,5 +2,7 @@
#define GUARD_POKEMON_STORAGE_SYSTEM_H
u8* GetBoxNamePtr(u8 boxNumber);
struct BoxPokemon *GetBoxedMonPtr(u8, u8);
void SetBoxMonNickFromAnyBox(u8, u8, u8 *);
#endif // GUARD_POKEMON_STORAGE_SYSTEM_H

227
include/region_map.h Normal file
View File

@ -0,0 +1,227 @@
#ifndef GUARD_REGION_MAP_H
#define GUARD_REGION_MAP_H
// Exported type declarations
enum {
REGION_MAP_LITTLEROOT_TOWN,
REGION_MAP_OLDALE_TOWN,
REGION_MAP_DEWFORD_TOWN,
REGION_MAP_LAVARIDGE_TOWN,
REGION_MAP_FALLARBOR_TOWN,
REGION_MAP_VERDANTURF_TOWN,
REGION_MAP_PACIFIDLOG_TOWN,
REGION_MAP_PETALBURG_CITY,
REGION_MAP_SLATEPORT_CITY,
REGION_MAP_MAUVILLE_CITY,
REGION_MAP_RUSTBORO_CITY,
REGION_MAP_FORTREE_CITY,
REGION_MAP_LILYCOVE_CITY,
REGION_MAP_MOSSDEEP_CITY,
REGION_MAP_SOOTOPOLIS_CITY,
REGION_MAP_EVER_GRANDE_CITY,
REGION_MAP_ROUTE_101,
REGION_MAP_ROUTE_102,
REGION_MAP_ROUTE_103,
REGION_MAP_ROUTE_104,
REGION_MAP_ROUTE_105,
REGION_MAP_ROUTE_106,
REGION_MAP_ROUTE_107,
REGION_MAP_ROUTE_108,
REGION_MAP_ROUTE_109,
REGION_MAP_ROUTE_110,
REGION_MAP_ROUTE_111,
REGION_MAP_ROUTE_112,
REGION_MAP_ROUTE_113,
REGION_MAP_ROUTE_114,
REGION_MAP_ROUTE_115,
REGION_MAP_ROUTE_116,
REGION_MAP_ROUTE_117,
REGION_MAP_ROUTE_118,
REGION_MAP_ROUTE_119,
REGION_MAP_ROUTE_120,
REGION_MAP_ROUTE_121,
REGION_MAP_ROUTE_122,
REGION_MAP_ROUTE_123,
REGION_MAP_ROUTE_124,
REGION_MAP_ROUTE_125,
REGION_MAP_ROUTE_126,
REGION_MAP_ROUTE_127,
REGION_MAP_ROUTE_128,
REGION_MAP_ROUTE_129,
REGION_MAP_ROUTE_130,
REGION_MAP_ROUTE_131,
REGION_MAP_ROUTE_132,
REGION_MAP_ROUTE_133,
REGION_MAP_ROUTE_134,
REGION_MAP_UNDERWATER_124,
REGION_MAP_UNDERWATER_125,
REGION_MAP_UNDERWATER_126,
REGION_MAP_UNDERWATER_127,
REGION_MAP_UNDERWATER_128,
REGION_MAP_GRANITE_CAVE,
REGION_MAP_MT_CHIMNEY,
REGION_MAP_SAFARI_ZONE,
REGION_MAP_BATTLE_FRONTIER,
REGION_MAP_PETALBURG_WOODS,
REGION_MAP_RUSTURF_TUNNEL,
REGION_MAP_ABANDONED_SHIP,
REGION_MAP_NEW_MAUVILLE,
REGION_MAP_METEOR_FALLS,
REGION_MAP_METEOR_FALLS2,
REGION_MAP_MT_PYRE,
REGION_MAP_AQUA_HIDEOUT_OLD,
REGION_MAP_SHOAL_CAVE,
REGION_MAP_SEAFLOOR_CAVERN,
REGION_MAP_UNDERWATER,
REGION_MAP_VICTORY_ROAD,
REGION_MAP_MIRAGE_ISLAND,
REGION_MAP_CAVE_OF_ORIGIN,
REGION_MAP_SOUTHERN_ISLAND,
REGION_MAP_FIERY_PATH,
REGION_MAP_FIERY_PATH2,
REGION_MAP_JAGGED_PASS,
REGION_MAP_JAGGED_PASS2,
REGION_MAP_SEALED_CHAMBER,
REGION_MAP_UNDERWATER_SEALED_CHAMBER,
REGION_MAP_SCORCHED_SLAB,
REGION_MAP_ISLAND_CAVE,
REGION_MAP_DESERT_RUINS,
REGION_MAP_ANCIENT_TOMB,
REGION_MAP_INSIDE_OF_TRUCK,
REGION_MAP_SKY_PILLAR,
REGION_MAP_SECRET_BASE,
REGION_MAP_NONE,
REGION_MAP_PALLET_TOWN,
REGION_MAP_VIRIDIAN_CITY,
REGION_MAP_PEWTER_CITY,
REGION_MAP_CERULEAN_CITY,
REGION_MAP_LAVENDER_TOWN,
REGION_MAP_VERMILION_CITY,
REGION_MAP_CELADON_CITY,
REGION_MAP_FUCHSIA_CITY,
REGION_MAP_CINNABAR_ISLAND,
REGION_MAP_INDIGO_PLATEAU,
REGION_MAP_SAFFRON_CITY,
REGION_MAP_ROUTE_4,
REGION_MAP_ROUTE_10,
REGION_MAP_ROUTE_1,
REGION_MAP_ROUTE_2,
REGION_MAP_ROUTE_3,
REGION_MAP_ROUTE_4_2,
REGION_MAP_ROUTE_5,
REGION_MAP_ROUTE_6,
REGION_MAP_ROUTE_7,
REGION_MAP_ROUTE_8,
REGION_MAP_ROUTE_9,
REGION_MAP_ROUTE_10_2,
REGION_MAP_ROUTE_11,
REGION_MAP_ROUTE_12,
REGION_MAP_ROUTE_13,
REGION_MAP_ROUTE_14,
REGION_MAP_ROUTE_15,
REGION_MAP_ROUTE_16,
REGION_MAP_ROUTE_17,
REGION_MAP_ROUTE_18,
REGION_MAP_ROUTE_19,
REGION_MAP_ROUTE_20,
REGION_MAP_ROUTE_21,
REGION_MAP_ROUTE_22,
REGION_MAP_ROUTE_23,
REGION_MAP_ROUTE_24,
REGION_MAP_ROUTE_25,
REGION_MAP_VIRIDIAN_FOREST,
REGION_MAP_MT_MOON,
REGION_MAP_S_S_ANNE,
REGION_MAP_UNDERGROUND_PATH,
REGION_MAP_UNDERGROUND_PATH_2,
REGION_MAP_DIGLETTS_CAVE,
REGION_MAP_KANTO_VICTORY_ROAD,
REGION_MAP_ROCKET_HIDEOUT,
REGION_MAP_SILPH_CO,
REGION_MAP_POKEMON_MANSION,
REGION_MAP_KANTO_SAFARI_ZONE,
REGION_MAP_POKEMON_LEAGUE,
REGION_MAP_ROCK_TUNNEL,
REGION_MAP_SEAFOAM_ISLANDS,
REGION_MAP_POKEMON_TOWER,
REGION_MAP_CERULEAN_CAVE,
REGION_MAP_POWER_PLANT,
REGION_MAP_ONE_ISLAND,
REGION_MAP_TWO_ISLAND,
REGION_MAP_THREE_ISLAND,
REGION_MAP_FOUR_ISLAND,
REGION_MAP_FIVE_ISLAND,
REGION_MAP_SEVEN_ISLAND,
REGION_MAP_SIX_ISLAND,
REGION_MAP_KINDLE_ROAD,
REGION_MAP_TREASURE_BEACH,
REGION_MAP_CAPE_BRINK,
REGION_MAP_BOND_BRIDGE,
REGION_MAP_THREE_ISLE_PORT,
REGION_MAP_SEVII_ISLE_6,
REGION_MAP_SEVII_ISLE_7,
REGION_MAP_SEVII_ISLE_8,
REGION_MAP_SEVII_ISLE_9,
REGION_MAP_RESORT_GORGEOUS,
REGION_MAP_WATER_LABYRINTH,
REGION_MAP_FIVE_ISLE_MEADOW,
REGION_MAP_MEMORIAL_PILLAR,
REGION_MAP_OUTCAST_ISLAND,
REGION_MAP_GREEN_PATH,
REGION_MAP_WATER_PATH,
REGION_MAP_RUIN_VALLEY,
REGION_MAP_TRAINER_TOWER,
REGION_MAP_CANYON_ENTRANCE,
REGION_MAP_SEVAULT_CANYON,
REGION_MAP_TANOBY_RUINS,
REGION_MAP_SEVII_ISLE_22,
REGION_MAP_SEVII_ISLE_23,
REGION_MAP_SEVII_ISLE_24,
REGION_MAP_NAVEL_ROCK,
REGION_MAP_MT_EMBER,
REGION_MAP_BERRY_FOREST,
REGION_MAP_ICEFALL_CAVE,
REGION_MAP_ROCKET_WAREHOUSE,
REGION_MAP_TRAINER_TOWER_2,
REGION_MAP_DOTTED_HOLE,
REGION_MAP_LOST_CAVE,
REGION_MAP_PATTERN_BUSH,
REGION_MAP_ALTERING_CAVE,
REGION_MAP_TANOBY_CHAMBERS,
REGION_MAP_THREE_ISLE_PATH,
REGION_MAP_TANOBY_KEY,
REGION_MAP_BIRTH_ISLAND,
REGION_MAP_MONEAN_CHAMBER,
REGION_MAP_LIPTOO_CHAMBER,
REGION_MAP_WEEPTH_CHAMBER,
REGION_MAP_DILFORD_CHAMBER,
REGION_MAP_SCUFIB_CHAMBER,
REGION_MAP_RIXY_CHAMBER,
REGION_MAP_VIAPOIS_CHAMBER,
REGION_MAP_EMBER_SPA,
REGION_MAP_SPECIAL_AREA,
REGION_MAP_AQUA_HIDEOUT,
REGION_MAP_MAGMA_HIDEOUT,
REGION_MAP_MIRAGE_TOWER,
REGION_MAP_BIRTH_ISLAND_2,
REGION_MAP_FARAWAY_ISLAND,
REGION_MAP_ARTISAN_CAVE,
REGION_MAP_MARINE_CAVE,
REGION_MAP_UNDERWATER_MARINE_CAVE,
REGION_MAP_TERRA_CAVE,
REGION_MAP_UNDERWATER_TERRA_CAVE,
REGION_MAP_UNDERWATER_UNK1,
REGION_MAP_UNDERWATER_UNK2,
REGION_MAP_DESERT_UNDERPASS,
REGION_MAP_ALTERING_CAVE_2,
REGION_MAP_NAVEL_ROCK2,
REGION_MAP_TRAINER_HILL
};
// Exported RAM declarations
// Exported ROM declarations
void GetMapName(u8 *, u16, u16);
#endif //GUARD_REGION_MAP_H

View File

@ -30,5 +30,6 @@ void FieldObjectMoveDestCoords(struct MapObject *, u32, s16 *, s16 *);
void sub_8086230(void);
void c2_exit_to_overworld_2_switch(void);
bool32 sub_8087598(void);
void c2_exit_to_overworld_1_continue_scripts_restart_music(void);
#endif //GUARD_ROM4_H

View File

@ -2,5 +2,6 @@
#define GUARD_ROM6_H
void sub_81357FC(u8, void(void));
u8 GetIdxOfFirstPartyMemberThatIsNotAnEgg(void);
#endif //GUARD_ROM6_H

11
include/script_menu.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef GUARD_SCRIPT_MENU_H
#define GUARD_SCRIPT_MENU_H
// Exported type declarations
// Exported RAM declarations
// Exported ROM declarations
extern const u8 *const gUnknown_0858BAF0[9];
#endif //GUARD_SCRIPT_MENU_H

11
include/secret_base.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef GUARD_SECRET_BASE_H
#define GUARD_SECRET_BASE_H
// Exported type declarations
// Exported RAM declarations
// Exported ROM declarations
void sub_80E980C(void);
#endif //GUARD_SECRET_BASE_H

12
include/shop.h Normal file
View File

@ -0,0 +1,12 @@
#ifndef GUARD_SHOP_H
#define GUARD_SHOP_H
// Exported type declarations
// Exported RAM declarations
extern EWRAM_DATA struct ItemSlot gUnknown_02039F80[3];
// Exported ROM declarations
#endif //GUARD_SHOP_H

View File

@ -449,5 +449,6 @@ enum
};
#define NUM_SPECIES SPECIES_EGG
extern const u8 gSpeciesNames[][11];
#endif // GUARD_SPECIES_H

View File

@ -31,7 +31,7 @@ u8 *StringFillWithTerminator(u8 *dest, u16 n);
u8 *StringCopyN_Multibyte(u8 *dest, u8 *src, u32 n);
u32 StringLength_Multibyte(u8 *str);
u8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color);
bool32 sub_8009228(u8 *str);
bool32 IsStringJapanese(u8 *str);
bool32 sub_800924C(u8 *str, s32 n);
u8 GetExtCtrlCodeLength(u8 code);
static const u8 *SkipExtCtrlCode(const u8 *s);

View File

@ -8,5 +8,33 @@
// Exported ROM declarations
extern const u8 gText_FromSpace[];
extern const u8 gText_Lv50[];
extern const u8 gText_OpenLevel[];
extern const u8 gText_Mom[];
extern const u8 gText_Dad[];
extern const u8 gText_Cool[];
extern const u8 gText_Beauty[];
extern const u8 gText_Cute[];
extern const u8 gText_Smart[];
extern const u8 gText_Tough[];
extern const u8 gText_Single[];
extern const u8 gText_Double[];
extern const u8 gText_Spicy2[];
extern const u8 gText_Dry2[];
extern const u8 gText_Sweet2[];
extern const u8 gText_Bitter2[];
extern const u8 gText_Sour2[];
extern const u8 gText_Excellent[];
extern const u8 gText_VeryGood[];
extern const u8 gText_Good[];
extern const u8 gText_SoSo[];
extern const u8 gText_Bad[];
extern const u8 gText_TheWorst[];
extern const u8 gText_Slots[];
extern const u8 gText_Roulette[];
extern const u8 gText_Jackpot[];
extern const u8 gText_First[];
extern const u8 gText_Second[];
extern const u8 gText_Third[];
#endif //GUARD_STRINGS_H

21
include/tv.h Normal file
View File

@ -0,0 +1,21 @@
#ifndef GUARD_TV_H
#define GUARD_TV_H
// Exported type declarations
// Exported RAM declarations
// Exported ROM declarations
extern u8 *const gTVStringVarPtrs[3];
void ClearTVShowData(void);
void PutPokemonTodayCaughtOnAir(void);
u32 GetPlayerIDAsU32(void);
bool8 GetPriceReduction(u8 newsKind);
u8 GetRibbonCount(struct Pokemon *pokemon);
void sub_80EE184(void);
void sub_80F14F8(TVShow *shows);
int sub_80EF370(int value);
#endif //GUARD_TV_H

View File

@ -53,4 +53,14 @@
#define VAR_0x40BC 0x40BC
#define VAR_0x40C2 0x40C2
#define VAR_FRONTIER_FACILITY 0x40CF
#define VAR_DAILY_SLOTS 0x40E6
#define VAR_DAILY_WILDS 0x40E7
#define VAR_DAILY_BLENDER 0x40E8
#define VAR_DAILY_PLANTED_BERRIES 0x40E9
#define VAR_DAILY_PICKED_BERRIES 0x40EA
#define VAR_DAILY_ROULETTE 0x40EB
#define VAR_DAILY_BP 0x40F1
#endif // GUARD_VARS_H

View File

@ -64,7 +64,7 @@ SECTIONS {
asm/battle_controller_player.o(.text);
asm/battle_7.o(.text);
asm/battle_controller_opponent.o(.text);
asm/battle_9.o(.text);
src/battle_ai_switch_items.o(.text);
asm/battle_controller_linkopponent.o(.text);
src/pokemon_1.o(.text);
asm/pokemon_1.o(.text);
@ -148,7 +148,7 @@ SECTIONS {
asm/contest_effect.o(.text);
asm/record_mixing.o(.text);
asm/secret_base.o(.text);
asm/tv.o(.text);
src/tv.o(.text);
asm/contest_link_80F57C4.o(.text);
asm/script_pokemon_util_80F87D8.o(.text);
asm/field_poison.o(.text);
@ -388,7 +388,7 @@ SECTIONS {
data/contest_effect.o(.rodata);
data/record_mixing.o(.rodata);
data/secret_base.o(.rodata);
data/tv.o(.rodata);
src/tv.o(.rodata);
data/contest_link_80F57C4.o(.rodata);
data/script_pokemon_util_80F87D8.o(.rodata);
src/pokemon_size_record.o(.rodata)

View File

@ -40,6 +40,7 @@
#include "trainer_classes.h"
#include "evolution_scene.h"
#include "roamer.h"
#include "tv.h"
#include "safari_zone.h"
#include "battle_string_ids.h"
@ -64,7 +65,6 @@ struct UnknownPokemonStruct2
/*0x1D*/ u8 language;
};
extern u32 gBattleTypeFlags;
extern u8 gBattleCommunication[];
extern u8 gBattleTerrain;
extern u16 gBattle_BG0_X;
@ -88,7 +88,6 @@ extern void (*gBattleMainFunc)(void);
extern void (*gUnknown_030061E8)(void);
extern struct UnknownPokemonStruct2 gUnknown_02022FF8[3]; // what is it used for?
extern struct UnknownPokemonStruct2* gUnknown_02023058; // what is it used for?
extern u8 gBattleOutcome;
extern u8 gUnknown_02039B28[]; // possibly a struct?
extern struct UnknownStruct6 gUnknown_02038C28; // todo: identify & document
extern struct MusicPlayerInfo gMPlay_SE1;
@ -139,7 +138,6 @@ extern u8 gActionForBanks[BATTLE_BANKS_COUNT];
extern u16 gChosenMovesByBanks[BATTLE_BANKS_COUNT];
extern u8 gCurrentActionFuncId;
extern u8 gLastUsedAbility;
extern u16 gLastUsedItem;
extern u8 gUnknown_0203CF00[];
extern const u8* gBattlescriptPtrsForSelection[BATTLE_BANKS_COUNT];
extern const u8* gBattlescriptCurrInstr;
@ -152,7 +150,6 @@ extern u8 gCurrMovePos;
extern u8 gUnknown_020241E9;
extern u16 gLastUsedMove;
extern const u8 gSpeciesNames[][POKEMON_NAME_LENGTH + 1];
extern const struct BattleMove gBattleMoves[];
extern const u16 gUnknown_08C004E0[]; // battle textbox palette
extern const struct BgTemplate gUnknown_0831AA08[];
@ -226,8 +223,6 @@ extern u8 sub_81A9E28(void); // battle frontier 2
extern void sub_81A56E8(u8 bank); // battle frontier 2
extern void sub_81B8FB0(u8, u8); // party menu
extern u8 pokemon_order_func(u8); // party menu
extern void sub_80EC728(void); // tv
extern void sub_80EE184(void); // tv
extern bool8 InBattlePyramid(void);
// this file's functions
@ -859,7 +854,7 @@ static void CB2_HandleStartBattle(void)
{
s32 i;
for (i = 0; i < 2 && (gLinkPlayers[i].version & 0xFF) == 3; i++);
for (i = 0; i < 2 && (gLinkPlayers[i].version & 0xFF) == VERSION_EMERALD; i++);
if (i == 2)
gBattleCommunication[MULTIUSE_STATE] = 16;
@ -2073,7 +2068,7 @@ static void sub_8038F34(void)
else
monsCount = 2;
for (i = 0; i < monsCount && (gLinkPlayers[i].version & 0xFF) == 3; i++);
for (i = 0; i < monsCount && (gLinkPlayers[i].version & 0xFF) == VERSION_EMERALD; i++);
if (!gSaveBlock2Ptr->field_CA9_b && i == monsCount)
{
@ -4927,7 +4922,7 @@ static void HandleEndTurn_FinishBattle(void)
}
}
}
sub_80EC728();
PutPokemonTodayCaughtOnAir();
}
if (!(gBattleTypeFlags & (BATTLE_TYPE_LINK
@ -5324,30 +5319,30 @@ static void HandleAction_UseItem(void)
{
gBattleScripting.bank = gBankAttacker;
switch (*(gBattleStruct->field_C4 + (gBankAttacker >> 1)))
switch (*(gBattleStruct->AI_itemType + (gBankAttacker >> 1)))
{
case 1:
case 2:
case AI_ITEM_FULL_RESTORE:
case AI_ITEM_HEAL_HP:
break;
case 3:
case AI_ITEM_CURE_CONDITION:
gBattleCommunication[MULTISTRING_CHOOSER] = 0;
if (*(gBattleStruct->field_C6 + gBankAttacker / 2) & 1)
if (*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) & 1)
{
if (*(gBattleStruct->field_C6 + gBankAttacker / 2) & 0x3E)
if (*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) & 0x3E)
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
else
{
while (!(*(gBattleStruct->field_C6 + gBankAttacker / 2) & 1))
while (!(*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) & 1))
{
*(gBattleStruct->field_C6 + gBankAttacker / 2) >>= 1;
*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) >>= 1;
gBattleCommunication[MULTISTRING_CHOOSER]++;
}
}
break;
case 4:
case AI_ITEM_X_STAT:
gBattleCommunication[MULTISTRING_CHOOSER] = 4;
if (*(gBattleStruct->field_C6 + (gBankAttacker >> 1)) & 0x80)
if (*(gBattleStruct->AI_itemFlags + (gBankAttacker >> 1)) & 0x80)
{
gBattleCommunication[MULTISTRING_CHOOSER] = 5;
}
@ -5356,9 +5351,9 @@ static void HandleAction_UseItem(void)
PREPARE_STAT_BUFFER(gBattleTextBuff1, STAT_ATK)
PREPARE_STRING_BUFFER(gBattleTextBuff2, 0xD2)
while (!((*(gBattleStruct->field_C6 + (gBankAttacker >> 1))) & 1))
while (!((*(gBattleStruct->AI_itemFlags + (gBankAttacker >> 1))) & 1))
{
*(gBattleStruct->field_C6 + gBankAttacker / 2) >>= 1;
*(gBattleStruct->AI_itemFlags + gBankAttacker / 2) >>= 1;
gBattleTextBuff1[2]++;
}
@ -5366,7 +5361,7 @@ static void HandleAction_UseItem(void)
gBattleScripting.animArg2 = 0;
}
break;
case 5:
case AI_ITEM_GUARD_SPECS:
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
gBattleCommunication[MULTISTRING_CHOOSER] = 2;
else
@ -5374,7 +5369,7 @@ static void HandleAction_UseItem(void)
break;
}
gBattlescriptCurrInstr = gUnknown_082DBD3C[*(gBattleStruct->field_C4 + gBankAttacker / 2)];
gBattlescriptCurrInstr = gUnknown_082DBD3C[*(gBattleStruct->AI_itemType + gBankAttacker / 2)];
}
gCurrentActionFuncId = ACTION_RUN_BATTLESCRIPT;
}

View File

@ -331,7 +331,7 @@ void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves)
{
if (gTrainers[gTrainerBattleOpponent_A].items[i] != 0)
{
gBattleResources->battleHistory->TrainerItems[gBattleResources->battleHistory->itemsNo] = gTrainers[gTrainerBattleOpponent_A].items[i];
gBattleResources->battleHistory->trainerItems[gBattleResources->battleHistory->itemsNo] = gTrainers[gTrainerBattleOpponent_A].items[i];
gBattleResources->battleHistory->itemsNo++;
}
}

View File

@ -0,0 +1,951 @@
#include "global.h"
#include "battle.h"
#include "battle_controllers.h"
#include "abilities.h"
#include "moves.h"
#include "pokemon.h"
#include "species.h"
#include "rng.h"
#include "util.h"
#include "items.h"
#include "pokemon_item_effects.h"
extern u8 gActiveBank;
extern u8 gAbsentBankFlags;
extern u32 gBattleTypeFlags;
extern u32 gStatuses3[BATTLE_BANKS_COUNT];
extern struct BattlePokemon gBattleMons[BATTLE_BANKS_COUNT];
extern u16 gBattlePartyID[BATTLE_BANKS_COUNT];
extern u16 gUnknown_02024250[BATTLE_BANKS_COUNT];
extern u8 gUnknown_02024270[BATTLE_BANKS_COUNT];
extern u16 gDynamicBasePower;
extern u8 gBattleMoveFlags;
extern u8 gCritMultiplier;
extern s32 gBattleMoveDamage;
extern const struct BattleMove gBattleMoves[];
extern const struct BaseStats gBaseStats[];
extern const u8 gTypeEffectiveness[];
extern const u8 * const gItemEffectTable[]; // todo: fix once struct is declared
// this file's functions
static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng);
static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent);
static bool8 ShouldUseItem(void);
static bool8 ShouldSwitchIfPerishSong(void)
{
if (gStatuses3[gActiveBank] & STATUS3_PERISH_SONG
&& gDisableStructs[gActiveBank].perishSong1 == 0)
{
*(gBattleStruct->field_294 + gActiveBank) = 6;
EmitCmd_x21(1, 2, 0);
return TRUE;
}
return FALSE;
}
static bool8 ShouldSwitchIfWonderGuard(void)
{
u8 opposingIdentity;
u8 opposingBank;
u8 moveFlags;
s32 i, j;
s32 firstId;
s32 lastId; // + 1
struct Pokemon *party = NULL;
u16 move;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
return FALSE;
opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
if (gBattleMons[GetBankByIdentity(opposingIdentity)].ability != ABILITY_WONDER_GUARD)
return FALSE;
// check if pokemon has a super effective move
for (opposingBank = GetBankByIdentity(opposingIdentity), i = 0; i < 4; i++)
{
move = gBattleMons[gActiveBank].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
return FALSE;
}
// get party information
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
}
else
{
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
// find a pokemon in the party that has a super effective move
for (i = firstId; i < lastId; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[gActiveBank])
continue;
GetMonData(&party[i], MON_DATA_SPECIES); // unused return value
GetMonData(&party[i], MON_DATA_ALT_ABILITY); // unused return value
for (opposingBank = GetBankByIdentity(opposingIdentity), j = 0; j < 4; j++)
{
move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % 3 < 2)
{
// we found a mon
*(gBattleStruct->field_294 + gActiveBank) = i;
EmitCmd_x21(1, 2, 0);
return TRUE;
}
}
}
return FALSE; // at this point there is not a single pokemon in the party that has a super effective move against a pokemon with wonder guard
}
static bool8 FindMonThatAbsorbsOpponentsMove(void)
{
u8 bankIn1, bankIn2;
u8 absorbingTypeAbility;
s32 firstId;
s32 lastId; // + 1
struct Pokemon *party;
s32 i;
if (HasSuperEffectiveMoveAgainstOpponents(TRUE) && Random() % 3 != 0)
return FALSE;
if (gUnknown_02024250[gActiveBank] == 0)
return FALSE;
if (gUnknown_02024250[gActiveBank] == 0xFFFF)
return FALSE;
if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = gActiveBank;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
bankIn2 = gActiveBank;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
}
else
{
bankIn1 = gActiveBank;
bankIn2 = gActiveBank;
}
if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_FIRE)
absorbingTypeAbility = ABILITY_FLASH_FIRE;
else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_WATER)
absorbingTypeAbility = ABILITY_WATER_ABSORB;
else if (gBattleMoves[gUnknown_02024250[gActiveBank]].type == TYPE_ELECTRIC)
absorbingTypeAbility = ABILITY_VOLT_ABSORB;
else
return FALSE;
if (gBattleMons[gActiveBank].ability == absorbingTypeAbility)
return FALSE;
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
}
else
{
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
for (i = firstId; i < lastId; i++)
{
u16 species;
u8 monAbility;
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[bankIn1])
continue;
if (i == gBattlePartyID[bankIn2])
continue;
if (i == *(gBattleStruct->field_5C + bankIn1))
continue;
if (i == *(gBattleStruct->field_5C + bankIn2))
continue;
species = GetMonData(&party[i], MON_DATA_SPECIES);
if (GetMonData(&party[i], MON_DATA_ALT_ABILITY) != 0)
monAbility = gBaseStats[species].ability2;
else
monAbility = gBaseStats[species].ability1;
if (absorbingTypeAbility == monAbility && Random() & 1)
{
// we found a mon
*(gBattleStruct->field_294 + gActiveBank) = i;
EmitCmd_x21(1, 2, 0);
return TRUE;
}
}
return FALSE;
}
static bool8 ShouldSwitchIfNaturalCure(void)
{
if (!(gBattleMons[gActiveBank].status1 & STATUS_SLEEP))
return FALSE;
if (gBattleMons[gActiveBank].ability != ABILITY_NATURAL_CURE)
return FALSE;
if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 2)
return FALSE;
if ((gUnknown_02024250[gActiveBank] == 0 || gUnknown_02024250[gActiveBank] == 0xFFFF) && Random() & 1)
{
*(gBattleStruct->field_294 + gActiveBank) = 6;
EmitCmd_x21(1, 2, 0);
return TRUE;
}
else if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0 && Random() & 1)
{
*(gBattleStruct->field_294 + gActiveBank) = 6;
EmitCmd_x21(1, 2, 0);
return TRUE;
}
if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 1))
return TRUE;
if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 1))
return TRUE;
if (Random() & 1)
{
*(gBattleStruct->field_294 + gActiveBank) = 6;
EmitCmd_x21(1, 2, 0);
return TRUE;
}
return FALSE;
}
static bool8 HasSuperEffectiveMoveAgainstOpponents(bool8 noRng)
{
u8 opposingIdentity;
u8 opposingBank;
s32 i;
u8 moveFlags;
u16 move;
opposingIdentity = GetBankIdentity(gActiveBank) ^ BIT_SIDE;
opposingBank = GetBankByIdentity(opposingIdentity);
if (!(gAbsentBankFlags & gBitTable[opposingBank]))
{
for (i = 0; i < 4; i++)
{
move = gBattleMons[gActiveBank].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
{
if (noRng)
return TRUE;
if (Random() % 10 != 0)
return TRUE;
}
}
}
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
return FALSE;
opposingBank = GetBankByIdentity(opposingIdentity ^ BIT_MON);
if (!(gAbsentBankFlags & gBitTable[opposingBank]))
{
for (i = 0; i < 4; i++)
{
move = gBattleMons[gActiveBank].moves[i];
if (move == MOVE_NONE)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[opposingBank].species, gBattleMons[opposingBank].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE)
{
if (noRng)
return TRUE;
if (Random() % 10 != 0)
return TRUE;
}
}
}
return FALSE;
}
static bool8 AreStatsRaised(void)
{
u8 buffedStatsValue = 0;
s32 i;
for (i = 0; i < BATTLE_STATS_NO; i++)
{
if (gBattleMons[gActiveBank].statStages[i] > 6)
buffedStatsValue += gBattleMons[gActiveBank].statStages[i] - 6;
}
return (buffedStatsValue > 3);
}
static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent)
{
u8 bankIn1, bankIn2;
s32 firstId;
s32 lastId; // + 1
struct Pokemon *party;
s32 i, j;
u16 move;
u8 moveFlags;
if (gUnknown_02024250[gActiveBank] == 0)
return FALSE;
if (gUnknown_02024250[gActiveBank] == 0xFFFF)
return FALSE;
if (gUnknown_02024270[gActiveBank] == 0xFF)
return FALSE;
if (gBattleMoves[gUnknown_02024250[gActiveBank]].power == 0)
return FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = gActiveBank;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
bankIn2 = gActiveBank;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
}
else
{
bankIn1 = gActiveBank;
bankIn2 = gActiveBank;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
}
else
{
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
for (i = firstId; i < lastId; i++)
{
u16 species;
u8 monAbility;
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[bankIn1])
continue;
if (i == gBattlePartyID[bankIn2])
continue;
if (i == *(gBattleStruct->field_5C + bankIn1))
continue;
if (i == *(gBattleStruct->field_5C + bankIn2))
continue;
species = GetMonData(&party[i], MON_DATA_SPECIES);
if (GetMonData(&party[i], MON_DATA_ALT_ABILITY) != 0)
monAbility = gBaseStats[species].ability2;
else
monAbility = gBaseStats[species].ability1;
moveFlags = AI_TypeCalc(gUnknown_02024250[gActiveBank], species, monAbility);
if (moveFlags & flags)
{
bankIn1 = gUnknown_02024270[gActiveBank];
for (j = 0; j < 4; j++)
{
move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
if (move == 0)
continue;
moveFlags = AI_TypeCalc(move, gBattleMons[bankIn1].species, gBattleMons[bankIn1].ability);
if (moveFlags & MOVESTATUS_SUPEREFFECTIVE && Random() % moduloPercent == 0)
{
*(gBattleStruct->field_294 + gActiveBank) = i;
EmitCmd_x21(1, 2, 0);
return TRUE;
}
}
}
}
return FALSE;
}
static bool8 ShouldSwitch(void)
{
u8 bankIn1, bankIn2;
u8 *activeBankPtr; // needed to match
s32 firstId;
s32 lastId; // + 1
struct Pokemon *party;
s32 i;
s32 availableToSwitch;
if (gBattleMons[*(activeBankPtr = &gActiveBank)].status2 & (STATUS2_WRAPPED | STATUS2_ESCAPE_PREVENTION))
return FALSE;
if (gStatuses3[gActiveBank] & STATUS3_ROOTED)
return FALSE;
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_SHADOW_TAG, 0, 0))
return FALSE;
if (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gActiveBank, ABILITY_ARENA_TRAP, 0, 0))
return FALSE; // misses the flying or levitate check
if (AbilityBattleEffects(ABILITYEFFECT_FIELD_SPORT, 0, ABILITY_MAGNET_PULL, 0, 0))
{
if (gBattleMons[gActiveBank].type1 == TYPE_STEEL)
return FALSE;
if (gBattleMons[gActiveBank].type2 == TYPE_STEEL)
return FALSE;
}
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
return FALSE;
availableToSwitch = 0;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = *activeBankPtr;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON)])
bankIn2 = *activeBankPtr;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(*activeBankPtr) ^ BIT_MON);
}
else
{
bankIn1 = *activeBankPtr;
bankIn2 = *activeBankPtr;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
}
else
{
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
for (i = firstId; i < lastId; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_NONE)
continue;
if (GetMonData(&party[i], MON_DATA_SPECIES2) == SPECIES_EGG)
continue;
if (i == gBattlePartyID[bankIn1])
continue;
if (i == gBattlePartyID[bankIn2])
continue;
if (i == *(gBattleStruct->field_5C + bankIn1))
continue;
if (i == *(gBattleStruct->field_5C + bankIn2))
continue;
availableToSwitch++;
}
if (availableToSwitch == 0)
return FALSE;
if (ShouldSwitchIfPerishSong())
return TRUE;
if (ShouldSwitchIfWonderGuard())
return TRUE;
if (FindMonThatAbsorbsOpponentsMove())
return TRUE;
if (ShouldSwitchIfNaturalCure())
return TRUE;
if (HasSuperEffectiveMoveAgainstOpponents(FALSE))
return FALSE;
if (AreStatsRaised())
return FALSE;
if (FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTAFFECTED, 2)
|| FindMonWithFlagsAndSuperEffective(MOVESTATUS_NOTVERYEFFECTIVE, 3))
return TRUE;
return FALSE;
}
void AI_TrySwitchOrUseItem(void)
{
struct Pokemon *party;
u8 bankIn1, bankIn2;
s32 firstId;
s32 lastId; // + 1
u8 bankIdentity = GetBankIdentity(gActiveBank);
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
if (gBattleTypeFlags & BATTLE_TYPE_TRAINER)
{
if (ShouldSwitch())
{
if (*(gBattleStruct->field_294 + gActiveBank) == 6)
{
s32 monToSwitchId = GetMostSuitableMonToSwitchInto();
if (monToSwitchId == 6)
{
if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE))
{
bankIn1 = GetBankByIdentity(bankIdentity);
bankIn2 = bankIn1;
}
else
{
bankIn1 = GetBankByIdentity(bankIdentity);
bankIn2 = GetBankByIdentity(bankIdentity ^ BIT_MON);
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
}
else
{
firstId = 0, lastId = 6;
}
for (monToSwitchId = firstId; monToSwitchId < lastId; monToSwitchId++)
{
if (GetMonData(&party[monToSwitchId], MON_DATA_HP) == 0)
continue;
if (monToSwitchId == gBattlePartyID[bankIn1])
continue;
if (monToSwitchId == gBattlePartyID[bankIn2])
continue;
if (monToSwitchId == *(gBattleStruct->field_5C + bankIn1))
continue;
if (monToSwitchId == *(gBattleStruct->field_5C + bankIn2))
continue;
break;
}
}
*(gBattleStruct->field_294 + gActiveBank) = monToSwitchId;
}
*(gBattleStruct->field_5C + gActiveBank) = *(gBattleStruct->field_294 + gActiveBank);
return;
}
else if (ShouldUseItem())
{
return;
}
}
EmitCmd_x21(1, 0, (gActiveBank ^ BIT_SIDE) << 8);
}
#define TYPE_FORESIGHT 0xFE
#define TYPE_ENDTABLE 0xFF
static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var)
{
s32 i = 0;
while (gTypeEffectiveness[i] != TYPE_ENDTABLE)
{
if (gTypeEffectiveness[i] == TYPE_FORESIGHT)
{
i += 3;
continue;
}
else if (gTypeEffectiveness[i] == atkType)
{
// check type1
if (gTypeEffectiveness[i + 1] == defType1)
*var = (*var * gTypeEffectiveness[i + 2]) / 10;
// check type2
if (gTypeEffectiveness[i + 1] == defType2 && defType1 != defType2)
*var = (*var * gTypeEffectiveness[i + 2]) / 10;
}
i += 3;
}
}
u8 GetMostSuitableMonToSwitchInto(void)
{
u8 opposingBank;
u8 bestDmg; // note : should be changed to u32 for obvious reasons
u8 bestMonId;
u8 bankIn1, bankIn2;
s32 firstId;
s32 lastId; // + 1
struct Pokemon *party;
s32 i, j;
u8 invalidMons;
u16 move;
if (*(gBattleStruct->field_5C + gActiveBank) != 6)
return *(gBattleStruct->field_5C + gActiveBank);
if (gBattleTypeFlags & BATTLE_TYPE_ARENA)
return gBattlePartyID[gActiveBank] + 1;
if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE)
{
bankIn1 = gActiveBank;
if (gAbsentBankFlags & gBitTable[GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON)])
bankIn2 = gActiveBank;
else
bankIn2 = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_MON);
// UB: It considers the opponent only player's side even though it can battle alongside player;
opposingBank = Random() & BIT_MON;
if (gAbsentBankFlags & gBitTable[opposingBank])
opposingBank ^= BIT_MON;
}
else
{
opposingBank = GetBankByIdentity(GetBankIdentity(gActiveBank) ^ BIT_SIDE);
bankIn1 = gActiveBank;
bankIn2 = gActiveBank;
}
if (gBattleTypeFlags & (BATTLE_TYPE_TWO_OPPONENTS | BATTLE_TYPE_x800000))
{
if ((gActiveBank & BIT_MON) == 0)
firstId = 0, lastId = 3;
else
firstId = 3, lastId = 6;
}
else
{
firstId = 0, lastId = 6;
}
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
invalidMons = 0;
while (invalidMons != 0x3F) // all mons are invalid
{
bestDmg = 0;
bestMonId = 6;
// find the mon which type is the most suitable offensively
for (i = firstId; i < lastId; i++)
{
u16 species = GetMonData(&party[i], MON_DATA_SPECIES);
if (species != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_HP) != 0
&& !(gBitTable[i] & invalidMons)
&& gBattlePartyID[bankIn1] != i
&& gBattlePartyID[bankIn2] != i
&& i != *(gBattleStruct->field_5C + bankIn1)
&& i != *(gBattleStruct->field_5C + bankIn2))
{
u8 type1 = gBaseStats[species].type1;
u8 type2 = gBaseStats[species].type2;
u8 typeDmg = 10;
ModulateByTypeEffectiveness(gBattleMons[opposingBank].type1, type1, type2, &typeDmg);
ModulateByTypeEffectiveness(gBattleMons[opposingBank].type2, type1, type2, &typeDmg);
if (bestDmg < typeDmg)
{
bestDmg = typeDmg;
bestMonId = i;
}
}
else
{
invalidMons |= gBitTable[i];
}
}
// ok, we know the mon has the right typing but does it have at least one super effective move?
if (bestMonId != 6)
{
for (i = 0; i < 4; i++)
{
move = GetMonData(&party[bestMonId], MON_DATA_MOVE1 + i);
if (move != MOVE_NONE && TypeCalc(move, gActiveBank, opposingBank) & MOVESTATUS_SUPEREFFECTIVE)
break;
}
if (i != 4)
return bestMonId; // has both the typing and at least one super effective move
invalidMons |= gBitTable[bestMonId]; // sorry buddy, we want something better
}
else
{
invalidMons = 0x3F; // no viable mon to switch
}
}
gDynamicBasePower = 0;
gBattleStruct->dynamicMoveType = 0;
gBattleScripting.dmgMultiplier = 1;
gBattleMoveFlags = 0;
gCritMultiplier = 1;
bestDmg = 0;
bestMonId = 6;
// if we couldn't find the best mon in terms of typing, find the one that deals most damage
for (i = firstId; i < lastId; i++)
{
if ((u16)(GetMonData(&party[i], MON_DATA_SPECIES)) == SPECIES_NONE)
continue;
if (GetMonData(&party[i], MON_DATA_HP) == 0)
continue;
if (gBattlePartyID[bankIn1] == i)
continue;
if (gBattlePartyID[bankIn2] == i)
continue;
if (i == *(gBattleStruct->field_5C + bankIn1))
continue;
if (i == *(gBattleStruct->field_5C + bankIn2))
continue;
for (j = 0; j < 4; j++)
{
move = GetMonData(&party[i], MON_DATA_MOVE1 + j);
gBattleMoveDamage = 0;
if (move != MOVE_NONE && gBattleMoves[move].power != 1)
{
AI_CalcDmg(gActiveBank, opposingBank);
TypeCalc(move, gActiveBank, opposingBank);
}
if (bestDmg < gBattleMoveDamage)
{
bestDmg = gBattleMoveDamage;
bestMonId = i;
}
}
}
return bestMonId;
}
// TODO: use PokemonItemEffect struct instead of u8 once it's documented
static u8 GetAI_ItemType(u8 itemId, const u8 *itemEffect) // NOTE: should take u16 as item Id argument
{
if (itemId == ITEM_FULL_RESTORE)
return AI_ITEM_FULL_RESTORE;
if (itemEffect[4] & 4)
return AI_ITEM_HEAL_HP;
if (itemEffect[3] & 0x3F)
return AI_ITEM_CURE_CONDITION;
if (itemEffect[0] & 0x3F || itemEffect[1] != 0 || itemEffect[2] != 0)
return AI_ITEM_X_STAT;
if (itemEffect[3] & 0x80)
return AI_ITEM_GUARD_SPECS;
return AI_ITEM_NOT_RECOGNIZABLE;
}
static bool8 ShouldUseItem(void)
{
struct Pokemon *party;
s32 i;
u8 validMons = 0;
bool8 shouldUse = FALSE;
if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER && GetBankIdentity(gActiveBank) == IDENTITY_PLAYER_MON2)
return FALSE;
if (GetBankSide(gActiveBank) == SIDE_PLAYER)
party = gPlayerParty;
else
party = gEnemyParty;
for (i = 0; i < 6; i++)
{
if (GetMonData(&party[i], MON_DATA_HP) != 0
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_NONE
&& GetMonData(&party[i], MON_DATA_SPECIES2) != SPECIES_EGG)
{
validMons++;
}
}
for (i = 0; i < 4; i++)
{
u16 item;
const u8 *itemEffects;
u8 paramOffset;
u8 bankSide;
if (i != 0 && validMons > (gBattleResources->battleHistory->itemsNo - i) + 1)
continue;
item = gBattleResources->battleHistory->trainerItems[i];
if (item == ITEM_NONE)
continue;
if (gItemEffectTable[item - 13] == NULL)
continue;
if (item == ITEM_ENIGMA_BERRY)
itemEffects = gSaveBlock1Ptr->enigmaBerry.itemEffect;
else
itemEffects = gItemEffectTable[item - 13];
*(gBattleStruct->AI_itemType + gActiveBank / 2) = GetAI_ItemType(item, itemEffects);
switch (*(gBattleStruct->AI_itemType + gActiveBank / 2))
{
case AI_ITEM_FULL_RESTORE:
if (gBattleMons[gActiveBank].hp >= gBattleMons[gActiveBank].maxHP / 4)
break;
if (gBattleMons[gActiveBank].hp == 0)
break;
shouldUse = TRUE;
break;
case AI_ITEM_HEAL_HP:
paramOffset = GetItemEffectParamOffset(item, 4, 4);
if (paramOffset == 0)
break;
if (gBattleMons[gActiveBank].hp == 0)
break;
if (gBattleMons[gActiveBank].hp < gBattleMons[gActiveBank].maxHP / 4 || gBattleMons[gActiveBank].maxHP - gBattleMons[gActiveBank].hp > itemEffects[paramOffset])
shouldUse = TRUE;
break;
case AI_ITEM_CURE_CONDITION:
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
if (itemEffects[3] & 0x20 && gBattleMons[gActiveBank].status1 & STATUS_SLEEP)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x10 && (gBattleMons[gActiveBank].status1 & STATUS_POISON || gBattleMons[gActiveBank].status1 & STATUS_TOXIC_POISON))
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x10;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x8 && gBattleMons[gActiveBank].status1 & STATUS_BURN)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x4 && gBattleMons[gActiveBank].status1 & STATUS_FREEZE)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x2 && gBattleMons[gActiveBank].status1 & STATUS_PARALYSIS)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
shouldUse = TRUE;
}
if (itemEffects[3] & 0x1 && gBattleMons[gActiveBank].status2 & STATUS2_CONFUSION)
{
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
shouldUse = TRUE;
}
break;
case AI_ITEM_X_STAT:
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) = 0;
if (gDisableStructs[gActiveBank].isFirstTurn == 0)
break;
if (itemEffects[0] & 0xF)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x1;
if (itemEffects[1] & 0xF0)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x2;
if (itemEffects[1] & 0xF)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x4;
if (itemEffects[2] & 0xF)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x8;
if (itemEffects[2] & 0xF0)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x20;
if (itemEffects[0] & 0x30)
*(gBattleStruct->AI_itemFlags + gActiveBank / 2) |= 0x80;
shouldUse = TRUE;
break;
case AI_ITEM_GUARD_SPECS:
bankSide = GetBankSide(gActiveBank);
if (gDisableStructs[gActiveBank].isFirstTurn != 0 && gSideTimers[bankSide].mistTimer == 0)
shouldUse = TRUE;
break;
case AI_ITEM_NOT_RECOGNIZABLE:
return FALSE;
}
if (shouldUse)
{
EmitCmd_x21(1, 1, 0);
*(gBattleStruct->field_C0 + (gActiveBank / 2) * 2) = item;
gBattleResources->battleHistory->trainerItems[i] = 0;
return shouldUse;
}
}
return FALSE;
}

View File

@ -1772,11 +1772,11 @@ u8 TypeCalc(u16 move, u8 bankAtk, u8 bankDef)
return flags;
}
u8 AI_TypeCalc(u16 move, u16 species, u8 ability)
u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility)
{
s32 i = 0;
u8 flags = 0;
u8 type1 = gBaseStats[species].type1, type2 = gBaseStats[species].type2;
u8 type1 = gBaseStats[targetSpecies].type1, type2 = gBaseStats[targetSpecies].type2;
u8 moveType;
if (move == MOVE_STRUGGLE)
@ -1784,7 +1784,7 @@ u8 AI_TypeCalc(u16 move, u16 species, u8 ability)
moveType = gBattleMoves[move].type;
if (ability == ABILITY_LEVITATE && moveType == TYPE_GROUND)
if (targetAbility == ABILITY_LEVITATE && moveType == TYPE_GROUND)
{
flags = MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED;
}
@ -1809,7 +1809,7 @@ u8 AI_TypeCalc(u16 move, u16 species, u8 ability)
i += 3;
}
}
if (ability == ABILITY_WONDER_GUARD
if (targetAbility == ABILITY_WONDER_GUARD
&& (!(flags & MOVESTATUS_SUPEREFFECTIVE) || ((flags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)))
&& gBattleMoves[move].power)
flags |= MOVESTATUS_NOTAFFECTED;
@ -11087,7 +11087,7 @@ static void atkEF_pokeball_catch_calculation(void)
{
if (gLastUsedItem == ITEM_MASTER_BALL)
{
gBattleResults.unk5_1 = 1;
gBattleResults.usedMasterBall = TRUE;
}
else
{

View File

@ -353,7 +353,7 @@ void sub_803F850(u8 arg0)
{
s32 i;
for (i = 0; i < sub_8009FCC(); i++)
for (i = 0; i < GetLinkPlayerCount(); i++)
gBattleExecBuffer |= gBitTable[arg0] << (i << 2);
gBattleExecBuffer &= ~(0x10000000 << arg0);

View File

@ -1,4 +1,5 @@
#include "global.h"
#include "diploma.h"
#include "palette.h"
#include "main.h"
#include "gpu_regs.h"
@ -33,7 +34,7 @@ static void InitDiplomaBg(void);
static void InitDiplomaWindow(void);
static void PrintDiplomaText(u8 *, u8, u8);
EWRAM_DATA void **gDiplomaTilemapPtr = {NULL};
EWRAM_DATA static void **sDiplomaTilemapPtr = {NULL};
static void VBlankCB(void)
{
@ -42,14 +43,14 @@ static void VBlankCB(void)
TransferPlttBuffer();
}
static const u16 gDiplomaPalettes[][16] =
static const u16 sDiplomaPalettes[][16] =
{
INCBIN_U16("graphics/misc/diploma_national.gbapal"),
INCBIN_U16("graphics/misc/diploma_hoenn.gbapal"),
};
static const u8 gDiplomaTilemap[] = INCBIN_U8("graphics/misc/diploma_map.bin.lz");
static const u8 gDiplomaTiles[] = INCBIN_U8("graphics/misc/diploma.4bpp.lz");
static const u8 sDiplomaTilemap[] = INCBIN_U8("graphics/misc/diploma_map.bin.lz");
static const u8 sDiplomaTiles[] = INCBIN_U8("graphics/misc/diploma.4bpp.lz");
void CB2_ShowDiploma(void)
{
@ -76,15 +77,15 @@ void CB2_ShowDiploma(void)
ResetSpriteData();
ResetPaletteFade();
FreeAllSpritePalettes();
LoadPalette(gDiplomaPalettes, 0, 64);
gDiplomaTilemapPtr = malloc(0x1000);
LoadPalette(sDiplomaPalettes, 0, 64);
sDiplomaTilemapPtr = malloc(0x1000);
InitDiplomaBg();
InitDiplomaWindow();
reset_temp_tile_data_buffers();
decompress_and_copy_tile_data_to_vram(1, &gDiplomaTiles, 0, 0, 0);
decompress_and_copy_tile_data_to_vram(1, &sDiplomaTiles, 0, 0, 0);
while (free_temp_tile_data_buffers_if_possible())
;
LZDecompressWram(&gDiplomaTilemap, gDiplomaTilemapPtr);
LZDecompressWram(&sDiplomaTilemap, sDiplomaTilemapPtr);
CopyBgTilemapBufferToVram(1);
DisplayDiplomaText();
BlendPalettes(-1, 16, 0);
@ -122,7 +123,7 @@ static void Task_DiplomaFadeOut(u8 taskId)
{
if (!gPaletteFade.active)
{
Free(gDiplomaTilemapPtr);
Free(sDiplomaTilemapPtr);
FreeAllWindowBuffers();
DestroyTask(taskId);
SetMainCallback2(sub_80861E8);
@ -147,7 +148,7 @@ static void DisplayDiplomaText(void)
CopyWindowToVram(0, 3);
}
static const struct BgTemplate gDiplomaBgTemplates[2] =
static const struct BgTemplate sDiplomaBgTemplates[2] =
{
{
.bg = 0,
@ -172,8 +173,8 @@ static const struct BgTemplate gDiplomaBgTemplates[2] =
static void InitDiplomaBg(void)
{
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, gDiplomaBgTemplates, 2);
SetBgTilemapBuffer(1, gDiplomaTilemapPtr);
InitBgsFromTemplates(0, sDiplomaBgTemplates, 2);
SetBgTilemapBuffer(1, sDiplomaTilemapPtr);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
ShowBg(0);
ShowBg(1);
@ -182,7 +183,7 @@ static void InitDiplomaBg(void)
SetGpuReg(REG_OFFSET_BLDY, DISPCNT_MODE_0);
}
static const struct WindowTemplate gDiplomaWinTemplates[2] =
static const struct WindowTemplate sDiplomaWinTemplates[2] =
{
{
.priority = 0,
@ -198,7 +199,7 @@ static const struct WindowTemplate gDiplomaWinTemplates[2] =
static void InitDiplomaWindow(void)
{
InitWindows(gDiplomaWinTemplates);
InitWindows(sDiplomaWinTemplates);
DeactivateAllTextPrinters();
LoadPalette(gUnknown_0860F074, 0xF0, 0x20);
FillWindowPixelBuffer(0, 0);

View File

@ -59,7 +59,7 @@ extern u8* GetMonNick(struct Pokemon* mon, u8* dst);
extern u8* GetBoxMonNick(struct BoxPokemon* boxMon, u8* dst);
extern u8 sav1_map_get_name(void);
extern s8 sub_8198C58(void);
extern void sub_81DB5E8(u8* str1, u8* str2, u8);
extern void TVShowConvertInternationalString(u8* str1, u8* str2, u8);
extern void sub_806A068(u16, u8);
extern void fade_screen(u8, u8);
extern void overworld_free_bg_tilemaps(void);
@ -404,8 +404,8 @@ static bool8 sub_807158C(struct DaycareData* daycare, u8 daycareId)
|| StringCompareWithoutExtCtrlCodes(gSaveBlock2Ptr->playerName, daycareMon->OT_name) != 0))
{
StringCopy(gStringVar1, nick);
sub_81DB5E8(gStringVar2, daycareMon->OT_name, daycareMon->language_maybe);
sub_81DB5E8(gStringVar3, daycareMon->monName, daycareMon->unknown);
TVShowConvertInternationalString(gStringVar2, daycareMon->OT_name, daycareMon->language_maybe);
TVShowConvertInternationalString(gStringVar3, daycareMon->monName, daycareMon->unknown);
return TRUE;
}
return FALSE;

View File

@ -17,6 +17,7 @@
#include "easy_chat.h"
#include "event_data.h"
#include "money.h"
#include "tv.h"
#include "coins.h"
#include "text.h"
@ -36,7 +37,6 @@ extern void sub_813624C(void); // clears something pokeblock related
extern void ResetPokedex(void);
extern void sub_8084400(void);
extern void ClearMailData(void);
extern void ClearTVShowData(void);
extern void ResetGabbyAndTy(void);
extern void ResetSecretBases(void);
extern void ResetLinkContestBoolean(void);

View File

@ -114,7 +114,7 @@ void sub_80FC190(void)
{
SetMainCallback2(c2_exit_to_overworld_2_switch);
}
else if (gBattleOutcome == 8)
else if (gBattleOutcome == BATTLE_SAFARI_OUT_OF_BALLS)
{
ScriptContext2_RunNewScript(gUnknown_082A4B4C);
warp_in();

View File

@ -170,13 +170,13 @@ extern const u8 gText_BattlePyramidFloor[];
void DisplayPyramidFloorWindow(void)
{
// TODO: fix location
if (*(u16*)(&gSaveBlock2Ptr->field_CAA[8]) == 7)
if (gSaveBlock2Ptr->field_CAA[4] == 7)
sBattlePyramidFloorWindowId = AddWindow(&gPyramidFloorWindowTemplate_1);
else
sBattlePyramidFloorWindowId = AddWindow(&gPyramidFloorWindowTemplate_2);
PutWindowTilemap(sBattlePyramidFloorWindowId);
sub_81973FC(sBattlePyramidFloorWindowId, 0);
StringCopy(gStringVar1, gUnknown_08510510[*(u16*)(&gSaveBlock2Ptr->field_CAA[8])]);
StringCopy(gStringVar1, gUnknown_08510510[gSaveBlock2Ptr->field_CAA[4]]);
StringExpandPlaceholders(gStringVar4, gText_BattlePyramidFloor);
PrintTextOnWindow(sBattlePyramidFloorWindowId, 1, gStringVar4, 0, 1, 0xFF, NULL);
CopyWindowToVram(sBattlePyramidFloorWindowId, 2);

View File

@ -625,7 +625,7 @@ u8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color)
return dest;
}
bool32 sub_8009228(u8 *str)
bool32 IsStringJapanese(u8 *str)
{
while (*str != EOS)
{

7927
src/tv.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -25,16 +25,9 @@
.include "src/fldeff_cut.o"
.include "src/script_menu.o"
.include "src/record_mixing.o"
.include "src/tv.o"
gUnknown_03001174: @ 3001174
.space 0x1
gUnknown_03001175: @ 3001175
.space 0x1
gUnknown_03001176: @ 3001176
.space 0x2
.space 1 @ TODO: define this u32 in mauville_old_man
gUnknown_03001178: @ 3001178
.space 0x4

View File

@ -210,13 +210,7 @@ gBattleMainFunc: @ 3005D04
.space 0xC
gBattleResults: @ 3005D10
.space 0x2A
gUnknown_03005D3A: @ 3005D3A
.space 0xC
gUnknown_03005D46: @ 3005D46
.space 0xE
.space 0x44
gLeveledUpInBattle: @ 3005D54
.space 0xC
@ -326,17 +320,7 @@ gUnknown_030060B4: @ 30060B4
gUnknown_030060B8: @ 30060B8
.space 0x4
gUnknown_030060BC: @ 30060BC
.space 0x4
gUnknown_030060C0: @ 30060C0
.space 0x10
gUnknown_030060D0: @ 30060D0
.space 0x10
gUnknown_030060E0: @ 30060E0
.space 0x50
.include "tv.o"
gUnknown_03006130: @ 3006130
.space 0x34
@ -393,7 +377,7 @@ gUnknown_030061EC: @ 30061EC
.space 0x4
.include"save.o"
.space 0x8
gRamSaveSectionLocations: @ 3006220

View File

@ -1029,16 +1029,7 @@ gBagPockets: @ 2039DD8
.space 0x28
gUnknown_02039E00: @ 2039E00
.space 0x2
gUnknown_02039E02: @ 2039E02
.space 0xB
gUnknown_02039E0D: @ 2039E0D
.space 0x11
gUnknown_02039E1E: @ 2039E1E
.space 0xE2
.space 0x100
gUnknown_02039F00: @ 2039F00
.space 0x8
@ -1145,26 +1136,7 @@ gUnknown_0203A01D: @ 203A01D
gUnknown_0203A020: @ 203A020
.space 0x4
gUnknown_0203A024: @ 203A024
.space 0x2
gUnknown_0203A026: @ 203A026
.space 0x2
gUnknown_0203A028: @ 203A028
.space 0x2
gUnknown_0203A02A: @ 203A02A
.space 0x2
gUnknown_0203A02C: @ 203A02C
.space 0x4
gUnknown_0203A030: @ 203A030
.space 0x1
gUnknown_0203A031: @ 203A031
.space 0x3
.include "src/tv.o"
gUnknown_0203A034: @ 203A034
.space 0x4